iterator- oder speicher-problem
-
folgender Code:
iter = m_PossibleOutputs[n].descriptors.begin(); iterend = m_PossibleOutputs[n].descriptors.end(); while( iter != iterend ) { if( deleteIterator ) { iter = m_PossibleOutputs[n].descriptors.erase( iter ); deleteIterator = false; } else { iter ++; originb4 = origincur; } ... if( Equal( originb4, origincur ) ) { ... timeOutput = new DifferentOutputs; timeOutput->refferenceUID = m_PossibleOutputs[n].refferenceUID; timeOutput->normale = m_PossibleOutputs[n].normale; timeOutput->pixelSpacing = m_PossibleOutputs[n].pixelSpacing; timeOutput->sliceSpacing = m_PossibleOutputs[n].sliceSpacing; timeOutput->numberOfSlices = - 1; timeOutput->numberOfTimeSlices = - 1; timeOutput->differentTimeSlices = false; timeOutput->descriptors.clear(); timeOutput->descriptors.push_back( (*iter) ); } else { ... m_PossibleOutputs.push_back( (*timeOutput) ); delete timeOutput; timeOutput = NULL; } ... }Erweiterung:
-iter und iterend sind Iteratoren;
-bei DifferentOutputs handelt es sich um eine Struktur;
-timeOutput ist ein Zeiger auf DifferentOutputs;
-bei m_PossibleOutputs um einen Vector von DifferentOutputs;
-bei m_PossibleOutputs.descriptors handelt es sich um eine Liste;
-in den ... befindet sich kein quelltext, der mit iter, iterend oder timeOutput zu tun hatProblem:
wenn ich zum zweiten mal timeOutput neu erstelle und anschließend per "m_PossibleOutputs.push_back( (*timeOutput) );" speichere, ist mein iter hin.
ich habe nummern für die elemente, über die der iterator läuft. wenn ich mir vor der zeile "m_PossibleOutputs.push_back( (*timeOutput) );" die restlichen elemente zwischen iter und iterend ausgeben lasse, dann sehen die zum beispiel so aus:266
267
268
269
270
271lasse ich mir die restlichen elemente nach dem aufruf ausgeben, dann sieht das so aus:
266
265
264
263
262
261Das läuft dann bis zum anfang zurück und weil davor nichts mehr kommt, booom.
//Edit: Codetags hinzugefügt. In Zukunft bitte selber dran denken! (evilissimo)
-
Was für einen Container verwendest du? Bei einem vector<> kann es passieren, daß der push_back()-Aufruf die Kapazität erhöhen muß - dabei werden alle noch vorhandenen Iteratoren ungültig.
PS: sfds
-
ich verwende den std::vector.
es wird wahrscheinlich daran liegen. was kann man dagegen unternehmen?
-
Wenn du weißt wie groß der Vektor wird gibt's
vector<>::reserve, ansonsten Indices statt Iteratoren speichern.
-
Entweder die notwendigen Iteratoren nach dem push_back() neu beschaffen oder umsteigen auf einen anderen Container (list<> zerstört keine Iteratoren, wenn es nicht sein muß).
-
hopsekey schrieb:
ich verwende den std::vector.
es wird wahrscheinlich daran liegen. was kann man dagegen unternehmen?Gleich auf die richtige Größe setzen, oder Iterator neu holen.
-
dieser doofe fehler hat mich unzählige nerven und 1 1/2 tage gekostet.ALSO EIN RIESEN DANKESCHÖN für den Tipp.
Ich habe es jetzt so gelöst.
... tempDescriptor = (*iter); m_PossibleOutputs.push_back( (*timeOutput) ); iter = m_PossibleOutputs[n].descriptors.begin(); iterend = m_PossibleOutputs[n].descriptors.end(); while( (*iter) != tempDescriptor ) iter++; ...Und es funktioniert. Jetzt kann man noch über eine schönere Variante reden.

list<> zerstört keine Iteratoren, wenn es nicht sein muß
aber sie macht es trotzdem irgendwann, irgendwie mal? den fall müsste ich abfangen.
weißt wie groß der Vektor wird
leider nicht.
-
hopsekey schrieb:
list<> zerstört keine Iteratoren, wenn es nicht sein muß
aber sie macht es trotzdem irgendwann, irgendwie mal? den fall müsste ich abfangen.
Ja, wenn du das betreffende Element löschst.