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 von beadsBoxes, 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....

InformationsquelleAutor Yotam | 2011-09-22
Schreibe einen Kommentar