Destruktor
-
Hab mal ne dumme frage (vielleicht resultiert diese daraus, dass ich einen denkfehler habe):
-
Ich habe irgendwo mal gelesen, dass es besser sein soll wenn man sich fuer auf dem Stack kreierte Objekte entscheidet, anstatt staendig eins mit new zu erstellen.
-
Folgende Situation: ich habe ne funktion die ne datei durchparst und anhand des inhalts instanzen einer klasse erstellt.
z.B.:
void foo(vector<Irgend_ne_Klasse *> *ptr2_obj_vector);
Hier sollen diese beispielsweise in einen vector gepackt werden.
Meine Frage:
Kann ich diese Objekte ohne new erzeugen und trotzdem ausserhalb der funktion davon ausgehen dass obiger vector gueltige objekte enthaelt, oder muss ich diese mit new erzeugen?
Wenn ich diese mit new erzeuge, kann ich dann davon ausgehen das sobald ausserhalb der funktion foo der vector zerstoert wird auch die objekte zerstoert werden, die er enthaelt, obwohl der destruktor fuer die objekte von Irgend_ne_Klasse leer implementiert ist oder muss ich selbst einen Destruktor der Klasse Irgend_ne_Klasse implementieren der dies tut? Genauer ich weiss nicht ob ein leer implementierter Destruktor einer Klasse auch Speicher wieder freigibt der mit new erzeugt wurde !?!?!?danke.
-
-
Original erstellt von <hilfe>:
**Hab mal ne dumme frage (vielleicht resultiert diese daraus, dass ich einen denkfehler habe):- Ich habe irgendwo mal gelesen, dass es besser sein soll wenn man sich fuer auf dem Stack kreierte Objekte entscheidet, anstatt staendig eins mit new zu erstellen.
**
Kommt immer drauf an. Wenn es auch genauso gut mit automatischen (dh auf dem Stack erzeugten) Objekten geht, dann mach das auch. Sowas ist zb Mist:
void foo() { Bar *b = new Bar; b->quux(); delete b; }
**
2)
void foo(vector<Irgend_ne_Klasse *> *ptr2_obj_vector);Kann ich diese Objekte ohne new erzeugen und trotzdem ausserhalb der funktion davon ausgehen dass obiger vector gueltige objekte enthaelt, oder muss ich diese mit new erzeugen?
**Der Vektor enthält überhaupt keine Objekte, er enthält Zeiger auf Objekte. Wenn diese Objekte nach Verlassen der Funktion nicht mehr existieren, zeigen die Zeiger ins Leere.
**
Wenn ich diese mit new erzeuge, kann ich dann davon ausgehen das sobald ausserhalb der funktion foo der vector zerstoert wird auch die objekte zerstoert werden, die er enthaelt, obwohl der destruktor fuer die objekte von Irgend_ne_Klasse leer implementiert ist oder muss ich selbst einen Destruktor der Klasse Irgend_ne_Klasse implementieren der dies tut?**Weder noch. Wie gesagt: Der Vektor enthält Zeiger, und keine Objekte. Wenn der Vektor zerstört wird, dann zerstört er die Zeiger. So wie hier:
void foo() { Bar *b = new Bar; }
Am Ende der Funktion wird b zerstört (der Zeiger hat als primitiver Datentyp natürlich keinen Destruktor, der irgendwas weltbewegendes tut), aber das Objekt, auf der er verweist, bleibt bestehen. Genauso mit deinem Vektor. Die Objekte, die hinter den Zeigern stehen, bleiben bestehen.
Du mußt sie also selbst zerstören:
void bar() { vector<Irgend_ne_Klasse*> v; foo(&v); // deine Funktion // blah blah for (vector<Irgend_ne_Klasse*>::iterator i = v.begin(); i != v.end(); ++i) delete *i; // jetzt enthält der vector lauter wilde Pointer // ist aber egal, denn er wird ja jetzt zerstört }
- Ich habe irgendwo mal gelesen, dass es besser sein soll wenn man sich fuer auf dem Stack kreierte Objekte entscheidet, anstatt staendig eins mit new zu erstellen.
-
Vielen Dank fuer die ausfuehrliche Antwort.
Ich denke ich habs nun kapiert.Danke.
gruss.