iterator bzw. pointer problem
-
hi,
habe folgenden code, der auch funktioniert (im prinzip fast das gleiche, nur bei einem &it bei dem anderen *it) und weiss nicht wieso es so sein muss. kann mir da jemand helfen oder mir zeigen wie es richtig gemacht werden muss?
void GarbageCollector::removeObject(Object* o) { std::cout << "GarbageCollector::removeObject(...)" << std::endl; for (std::vector<Object*>::iterator it = vecObjects.begin(); it != vecObjects.end();) { if (o == *it) { std::cout << " deleting object (" << o->serialNumber() << " - " << o << ")" << std::endl; it = vecObjects.erase(it); delete ⁢ } else { ++it; } } } void GarbageCollector::removeAllObjects() { std::cout << "GarbageCollector::removeAllObjects()" << std::endl; for (std::vector<Object*>::iterator it = vecObjects.begin(); it != vecObjects.end();) { std::cout << " vecObjects.size(): " << vecObjects.size() << std::endl; //vecObjects.erase(it); delete *it; } vecObjects.clear(); }
-
es ist erstens schlecht, einen iterator zu verwenden, nachdem er nicht mehr gültig ist (untere schleife, deshalb hast du das erase wohl auch kommentiert) und das
it = vecObjects.erase(it); delete ⁢du entfernst zuerst das alte objekt aus der liste, der iterator zeigt dann auf das nächste. dann versuchst du die stelle im speicher zu löschen, an der it selbst liegt. my best guess:
delete o.wenn ich fragen darf: was macht deine klasse denn feines?
-
hi,
mit delete o in removeObject(Object* o) klappts nicht. ich möchte ja eigentlich nur das object, dessen pointer im vector vecObjects steht, löschen und diesen eintrag aus dem vector entfernen.
zur klasse selber, ich bin z.z. eigentlich nur am c++ lernen etc (java beruflich und c++ privat nun) und wollte mir einen kleinen garbagecollector schreiben und vllt endlich mal ein spiel weiter schreiben (snes harvestmoon klon).. oder wenn ich lust hab nen service unter linux, der per snmp und xmlrpc sich daten von endgeräten aus meinem netzwerk holt, diese aufbereitet und grafisch anzeigt (rrdtool) bzw. hinterher soll das teil noch meine musik und filmsammlung managen...
-
was klappt nicht? fehlermeldung?
wenn das objekt in der liste ist und gefunden wird, führt
delete *itgenauso wiedelete ozur löschung des objekts.eventuell übergibst du der funktion einen zeiger, der gar nicht mehr gültig ist?
-
ich glaub ich sollte nochmal nachschauen wie die iteratoren richtig funktionieren.
und gültig dürften die zeiger eigentlich immer sein, auch wenn ich ein Objekt delete, wird im destruktor die funktion removeObject(this) vom garbagecollector aufgerufen.
es hakt bestimmt nur daran wie ich den vector durchlaufe und die referenzierten objekte lösche