STL Vector erase() lässt das PRogramm abstürzen.
-
Hallo ...
Langsam beginne ich die kleinen fiesen Dinger zu hassen, die sich Vektoren nennen. Erst das Problem wie sie überhaupt funktionieren.. habt ihr mir erfoglreich beibringen können. Dann das Problem sie per Referenz zu füllen: 1A, ihr seid Götter.^^Jetzt kommt die Königsdisziplin: Sie wieder zu löschen. >_<
Nun... dafür benutze ich persönlich erase(); was auch größtenteils funktioniert. Aber - aus Welchem Grund auch immer - stürzt das Programm plötzlich ab und gibt - wenn ich "Glück" habe - sogar die Windowswarnmeldung aus, dass das Programm einen Fehler festgestellt habe. Ansonsten passiert gar nichts - Das Programm beendet sich einfach nur.
Die betreffende Funktion wäre dnan folgende:
bool particle_think(vector<particle* > &arr, bool delete_if_error_occur) { int i=0; vector<particle* >::iterator iter; if(arr.empty()) { return false; } for(iter=arr.begin();iter!=arr.end();iter++) { try { if((*iter)->is_dying()==true) { delete (*iter); arr.erase(iter); if(arr.empty()) { return false; } } if((*iter)->think()==false && delete_if_error_occur==true) { (*iter)->let_it_die(); } } catch (...) { MessageBox(NULL,"Error occured in 'patricle::think()'.","Fatal Error!",MB_OK | MB_ICONINFORMATION); } i++; } return true; }Die Funktion lässt die Partikel einige Berechnungen usw durchführen. Eventuell 'stirbt' der Partikel dabei und soll aus dem Vektor und dem speicher entfernt werden.... ja.. dabei passiert der Fehler...
Meine Frage: Welchen dumm-naiven Fehler habe ich diesmal wieder fabriziert? Ich verzweifel langsam an dne Mistdingern...>_<
this->thanks();
-
arr.erase(iter);macht den Iterator iter ungültig!
-
Das heißt jetzt genau? ^^"
Wei...es löscht ja ein paar..aber irgenwann strüzt es dann eben ab..^^"
-
Hallo,
Ein erase auf einen vector macht deinen laufiterator iter ungültig. Glücklicherweise gibt erase den nächsten gültigen Iterator zurück.
for(iter=arr.begin();iter!=arr.end();) { try { if((*iter)->is_dying()) { delete (*iter); iter = arr.erase(iter); if(arr.empty()) return false; } else ++iter; if((*iter)->think()==false && delete_if_error_occur==true) { (*iter)->let_it_die(); } } catch (...) { MessageBox(NULL,"Error occured in 'patricle::think()'.","Fatal Error!",MB_OK | MB_ICONINFORMATION); } i++; }
-
Mhh...das ganze schießt mein Programm jetzt schon beim Start ab.
Es kompiliert Fehlerfrei, aber will nicht ganz laufen. Es startet..und stürzt ab. *seufz* Ich wusste immer das mir Vectoren nur Probleme machen werden. >-<
-
for(iter=arr.begin();iter!=arr.end();) { try { if((*iter)->is_dying()) { delete (*iter); iter = arr.erase(iter); if(arr.empty()) return false; } else { if((*iter)->think()==false && delete_if_error_occur==true) { (*iter)->let_it_die(); } ++iter; } } catch (...) { MessageBox(NULL,"Error occured in 'patricle::think()'.","Fatal Error!",MB_OK | MB_ICONINFORMATION); } i++; }
-
Ah..Wunderbar.
Das funktioniert einwandfrei!
Ich bedanke mich recht herzlichst bei euch allen!Vielen, vielen Dank.
-
Ich würde statt erase lieber remove benutzen und am Schluß nur einmal erase mit einer geeigneten Range aufrufen. Das ist im worst-case um einiges schneller und dürfte auch im Mittel um einiges schneller sein. Besonders wenn es viele Partikel sind.