PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Segfault durch unbekannten Fehler (Vermutung: Iteratoren kaputt gemacht)


liquid
2003-09-16, 19:56:50
Hiho,

lol, jetzt habe ich schon den Debugger bemüht den Fehler in meinem Code zu finden, aber tun tut er es nicht. Assembler hab ich zwar (also die Stelle wo er segfaultet, aber ein lock xadd Kommando sagt mir persönlich jetzt erstmal gar nüscht).

Jedenfalls tritt folgendes auf.

Ahja, erstmal Code:
void _FTM_manager::refresh_no_render(float time)
{
bool state = false;

for (_FTM_vec_iter i = vec.begin(); i != vec.end(); ++i)
{
state = i->update(time);

if (state)
vec.erase(i);

}
}

Und zwar denke ich, dass es da Probleme gibt. Und zwar...
Wird ja mit dem Iterator durch den Vektor spaziert, dann das Objekt geudpatet und gleichzeitig noch sein Status abgeholt. Wenn Status WAHR ist dann killen wir das Objekt. Sollte über den Iteratoren gehen.
Nun...
Frage: Wenn ich jetzt erase auf den Iterator aufrufe kann ich den nachher noch benutzen? Also er wird danach ja wieder inkrementiert, ich denke das bringt das ganze zum segfaulten.
Und es ist auch genau dieses erase welches als letzte bekannte Funktion im Debugger angezeigt wird. Danach bringt er in irgendeine vom Compiler erzeugte Funktion (so ein Wurschtelname) und kackt da ab.

Ich habe nur Angst deswegen -> Drück mich (http://sources.redhat.com/ml/binutils/2001-05/msg00273.html) - hab ich gefunden als ich nach dem ASM Code geguckt habe. Nicht dass ich jetzt den Compiler wechseln muss....

Was meint ihr? Sind es die Iteratoren die verrückt spielen? Und wenn ja wie kann ich das ändern? Irgendwie muss das Objekt ja kaputt gemacht werden. Ich kann ja nicht jedes Mal wenn ein Objekt gekillt wird in dem Vektor wieder von neu anfangen mit dem iterieren (also neuen Iteratoren holen und neu beginnen). Hmm, dumm sowas :(

cya
liquid

zeckensack
2003-09-16, 20:23:13
std::vector <T>::erase() kann Iteratoren ungültig machen :(

erase gibt aber einen gültigen Iterator auf das nächste Element zurück :)

ca so:
_FTM_vec_iter i = vec.begin();
while (i!=vec.end())
{
bool state = i->update(time);
if (state) i=vec.erase(i);
else ++i;
}

liquid
2003-09-16, 20:25:48
zecki ist der Meister!!
:love3:

Danke für die schnelle Antwort, dann wird das ja doch noch was mit meinem FTM Manager.

cya
liquid