Warum set-iterator-Zeiger Ursache segmentation fault?
Bottom line ist, warum sollte iterator Ursache segmentation fault?
Beachten Sie, ich bin Eingabe hier die relevanten Teile meines Codes und nicht kopieren und einfügen. Wenn es einen Fehler in der Zusammenstellung, bitte beachten Sie aber halten es nicht der Ursprung meiner Frage.
In meinem code, ich habe eine Karte von Kästen für Perlen:
map<vector<int>,set<shared_ptr<bead> > > > nextBoxes;
Jede Perle hat, unter anderem, eine vec pos
Mitglied, die wiederum hat:
class vec{
double x;
double y;
double z;
.
.
.
vector<int> getBox();
.
.
.
}
vector<int> vec::getBox(){
vector<int> out(3,0);
extern double boxSize;
out[0] = x/boxSize;
out[1] = y/boxSize;
out[2] = z/boxSize;
return out;
}
Verwende ich eine sehr einfache Methode, um durch die Perlen in den Schachteln
extern vectrot<shared_ptr<bead> > beads;
for (int i = 0; i < beads.size(); i++){
vector<int> t = beads[i]->pos.getBox();
nextBoxes[t].insert(beads[i]);
}
An anderer Stelle im code, die pos
Werte der Perlen ändern könnte und ich update die Boxen lokal.
Verwende ich die folgende Schleife, um zu gehen durch die Boxen und Perlen:
map<vector<int>,set<shared_ptr<bead> > >::iterator mit = nextBoxes.begin();
extarn vector<vector<int> >::targets; //holds a vector of a 1, -1 and 0 vectors of distance from the box
extern int boxNum;
while (mit != nextBoxes.end()){
vector<int> t1 = mit->second();
set<shared_ptr<bead> >::iterator bit1 = mit->second.begin();
set<shared_ptr<bead> >::iterator bit2;
while (bit1 != mit->second.end()){
shared_ptr<bead> b = *bit++;
vector<int> t2(3,0);
for (int i = 0; i < 13 i++){//13 is the size of the targets index.
for (int j = 0; j < 3; j++){
t2[j] = t1[j] + targets[i][j];
if (t2[j] >= boxNum) t2[j] -= boxNum;
if (t2[j] < 0 ) t2[j] += boxNum;
}
bit2 = beadsBoxes[t2].begin();
while (bit2 != nextBoxes[t2].end()){
shared_ptr<bead> b2 = *bit2++//the segmentation fault is here
.
.
.
}
}
}
}
Aus irgendeinem Grund, bekomme ich einen segmentation fault. Was ich so weit gekommen ist:
- den segmentation fault verursacht wird, weil die Inkrementierung der interator.
- die Größe der box ist die 2.
- dies ist nicht die erste box, die ich am testen (habe Sie nicht gezählt, aber es läuft für eine Weile).
- Ich habe absolut keine Ahnung wie Sie auf das zweite element in dem Feld (den ersten kann ich mit dem iterator-da ich nicht Anhängen.
-
Dies ist der Ausgabe-Fehler von gdb:
0 0x00002aaaaab43c65 in std::_Rb_tree_increment(std::_Rb_tree_node_base*) () from /usr/lib64/libstdc++.so.6
1 0x000000000041a28e operator++ (this=0x63d7c0) unter /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_tree.h:265
Werde ich für jede Hilfe dankbar, vielen Dank.
Edit:
Gelöst, irgendwie.
Versucht, um die Fehler auf ein minimum laufen Beispiel, ich habe alles gelöscht, was diese Zeile geschrieben und gestaltet Sie, und jetzt die Dinge gut Aussehen. Ich bin immer noch interessiert so ein Fall, obwohl:
Wenn Sie wollen, kann ich reask: Frage:
Wann wird der iterator inkrementelle Ursache für segmentation fault in c++?
- "Wenn es einen Fehler in der Zusammenstellung, bitte beachten Sie aber halten es nicht der Ursprung meiner Frage. "- Wenn der code, den Sie gezeigt haben, haben uns nicht kompilieren, haben wir keine Möglichkeit, zu erraten, was das eigentliche Problem ist.
- Ich sehe nicht, eine Erklärung von
bit2
noch eine Erklärung vonbeadsBoxes
, so kann ich wirklich nicht sagen, warum die angegebene Zeile ist der Fehler. Bitte reduzieren Sie Ihr Programm auf Ihre einfachste form, die zeigt immer noch das problem, und kopieren-einfügen, das Programm zu deiner Frage. In den Prozess der Verringerung Ihres Programms, können Sie die Fehler auf Ihrer eigenen. Weitere Informationen über das Abbau-und-einfügen-Technik, und warum es wichtig ist, finden Sie unter sscce.org. - die Idee ist, dass es nicht ein Fehler der Kompilierung zu beginnen
- Ich wünschte, ich könnte zu reduzieren, weiß ich nicht, aber der Grund für diese, und ich fürchte, es ist entstanden aus etwas, das immanent ist, dass in c++ verstehe ich nicht, noch nicht. Ich war der Hoffnung, dass dies einige gut bekannte Problem mit Iteratoren.
- aber mein Punkt ist, dass, wenn Sie zeigen uns-code, der nicht funktioniert, und sagen Sie uns, ignorieren Sie die Dinge, die machen es nicht funktioniert, dann ist es für uns unmöglich, Ihnen zu sagen, warum es nicht funktioniert! Wenn Sie möchten, eine nützliche Antwort, die Sie brauchen, um uns zu zeigen, code, wo das problem ist eben nur die, die Sie wollen helfen.
- Kommentare wie Rob ist, wo er Stand die
beadsBoxes
ist nicht deklariert relevant sind. Ich spreche (Schreibe eigentlich) über Kommentare wie vergessen;
oder nicht geschlossene Klammern. - entschuldigen Sie mich, aber Sie die Frage andere um Hilfe. Das bedeutet, dass Sie nicht verstehen, warum dein code verhält, wie es funktioniert. Und das bedeutet, dass Sie sind nicht die, die entscheiden, was ist oder ist nicht relevant. Wenn Sie wusste, was wichtig war, hätten Sie das problem schon selbst. Die Leute, die versuchen, Ihre Frage zu beantworten, sind diejenigen, die entscheiden, was relevant ist.
- alles, was ich sage jetzt wird nur machen Sie noch mehr wütend. Tut mir Leid, ich habe Sie verärgert. Ich war erst versucht zu betonen, einen Punkt....
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zur Beantwortung Ihrer Bearbeiten Sie die einzige mögliche Art und Weise:
Inkrementieren einen iterator verursacht einen segmentation fault nur, wenn es falsch verwendet wird.
Das ist es.
Der standard-Liste nicht die Fälle, in denen der code muss segfault, es listet nur, was passieren soll, wenn der code verwendet richtig. Wenn Sie es falsch, es ist einfach nicht definiertes Verhalten, und jeder der eine million Dinge, die passieren könnten, einschließlich, aber nicht beschränkt auf, speicherzugriffsverletzungen.
Inkrementieren, wenn Sie Ihre iterator-gab Sie einen segmentation Fault, ist es entweder, weil:
Aber die Segmentierung Fehler passieren, wenn Sie nicht definiertes Verhalten. Und dass, durch definition, ist es unmöglich zu sagen, welche Fälle löst einen "segmentation fault".
Mindestens ein Fehler vorhanden ist in diesen Zeilen:
Vorausgesetzt
beadsBoxes
undnextBoxes
sind Objekte der standard-container-Typen, verwenden Sie den iterator nicht richtig.bit2
scheint ein iterator zeigt auf die Mitglieder derbeadsBoxes
. Aber, Sie sind zu vergleichen mit dem Ende dernextBoxes
. WennbeadsBoxes[2]
undnextBoxes[2]
repräsentieren verschiedene Objekte, können Sie nicht tun.bit2
, der Fehler kann sehr gut auftreten inoperator++
und nicht inoperator*
.Die erste Sache, die Sie beheben sollten, ist
getBox
. Es gibt keinen Wert zurück, so undefiniert Verhalten passiert, wenn es aufgerufen wird. Hinzufügenreturn out;
am Ende.