STL erase funktioniert nicht
-
Hey,
ich bin gerade dabei, von einem Tracker mir immer Listen zu holen, die Informationen über Spieleserver enthalten.
Die Listen sind beide vom Typ "d3server". Diese struct ist gegliedert in Servername, Missionsname ... etc.
Ich hole mir alle 60 Sekunden die Liste erneut vom Server, wobei ich sie vorher auf die 2te Liste kopiere. Dann will ich die beiden Listen vergleichen.
Beispiel: Ein Server hat geschlossen - dadurch geht das Programm durch diesen Code:
for(list<d3server>::iterator old_itr = servers.begin(); old_itr != servers.end(); old_itr++) { for(list<d3server>::iterator itr = srv_list.begin(); itr != srv_list.end(); itr++) { if(old_itr->sname == itr->sname) { cout << "FOUND A MATCH!" << endl; itr=servers.erase(itr); cout << servers.size() << endl; break; } } }Jedesmal, wenn sich 2 Server gleichen, werden sie aus der Liste gestrichen - und zwar so lange, bis nur noch der Server übrig ist, der gerade zugemacht hat.
Die Liste "srv_list" ist die aktuelle, ohne den geschlossenen Server, die Liste "servers" enthält noch alle Server von vor 60 Sekunden (also auch den geschlossenen).
Im Prinzip würde das ganze wunderbar funktionieren, aber STL macht mir einen Strich durch die Rechnung - denn das "itr=servers.erase(itr);" (Zeile 9) funktioniert nicht! Die cout-Ausgabe liefert nach wie vor die selbe Größe, und die Einträge sind immernoch vorhanden.
Ich denke mal, dass es sich hierbei um einen kleinen Denkfehler handelt. Ich hoffe, ihr könnt mir helfen!
-
itriteriert doch übersrv_listund nicht überservers, oder?
-
Ich weiss jetzt nicht, wo dein Fehler ist, da erase grundsätzlich funktioniert.

Probier ansonsten einfach einmal ein einfaches Probe Beispiel zu Testzwecken zu schreiben und dann den Unterschied zu deiner Version zu finden.Im übrigen bist du sicher, dass sich die Grösse bestimmt nicht ändert, oder nur einen Wert hat, den du als falsch empfindest? - Geh da sonst auch mal mit dem Debugger durch.
-
Wie ich bereits sagte, liegt das Problem darin, dass der zu löschende Iterator zum falschen Container gehört.

Sollte eigentlich im Debug-Modus in einer Assertion enden...
-
Nexus schrieb:
Wie ich bereits sagte, liegt das Problem darin, dass der zu löschende Iterator zum falschen Container gehört.

Sollte eigentlich im Debug-Modus in einer Assertion enden...
Jop. Aber das hätte er auch selbst finden könne, wenn er mit dem Debuger das ganze ganz genau angeschaut hätte.

Ich habe mir das gar nicht angeschaut, ob der Iterator stimmt.:)
Wundert mich aber auch, dass es da keinen Crash gegeben hat..
-
Ah, genau das war's! Danke!
Leider hat mir weder GDB noch Valgrind dazu was ausgegeben

-
ChocoHopper schrieb:
Leider hat mir weder GDB noch Valgrind dazu was ausgegeben

Das wäre aber auch Aufgabe deiner STL-Implementierung, diesen Fehler zu melden (Assertion). Hast du denn im Debug-Modus kompiliert?