Löschen eines Zeigers nach Einfügen in eine Liste verhindern
-
Mir fällt kein passenderer Titel ein, folgendes:
// Pseudocode: abstract class Obj { void print (); }; class ObjA : Obj { void print () { cout << "A"; } } class ObjB : Obj { void print () { cout << "B"; } } class ObjContainer { void addObj (Obj* obj) { data.push_back(obj); // HIER: Ab hier darf obj nicht mehr gelöscht werden, der Zeiger muss also mir alleine gehören. Wie kann ich verhindern, dass der User das unten stehende Hauptprogramm ausführt? } void print (); // Geht mit Iter data durch und führt immer (*Runner)->print() aus list<Obj*> data; } // main Obj* a = new ObjA; Obj* b = new ObjB; ObjContainer cont; cont.addObj (a); cont.addObj (b); // OHOH PROBLEM: delete a; cont.print (); // Segmention fault
Wie kann ich das verhindern? Hoffe ihr könnt mir helfen
-
im prinzip kannst du es garnich verhindern, smart_ptr wären aber mal ein anfang
-
Falscher Thread.
MfG SideWInder
-
Verfolgt man in kommerziellen Libraries andere Konzepte als meines zum Sammeln von Objekten (welche?), oder schützen die ihre Zeiger (wie?). Die werden sich doch nicht selbst sprengen wie mein Beispiel hier zeigt
Was ist ein smart_ptr? In der MSDN gibts dazu nichts
-
Wie wärs damit?
data.push_back(obj.clone());
-
Habe ich mir auch schon überlegt, aber ein offenes File lässt sich nicht gut clonen, da Betriebssysteme meistens nur einem Handle Zugriff überlassen.
Hab jetzt was zu smart_ptr bei Boost gefunden, ist das so einer?
-
evtl. nimmst du einen sharedpointer.
Devil