Dtor und STL container
-
Hallo!
Kurze Frage:
Was passiert mit einem STL container (z.B. vector), wenn ein leerer Dtor aufgerufen wird?
Wird der Dtor des containers aufgerufen, und damit der Dtor für alle Elemente?Danke für eure Antworten!
-
Das kommt darauf an, in welcher Beziehung der vector<> zu dem Objekt steht, dessen Dtor aufgerufen wurde.
Wobei: wirklich leer ist ein Dtor eigentlich nie - nachdem der (möglicherweise leere) Dtor-Rumpf abgearbeitet wurde, werden die Destruktoren der Member und der Basisklassen in umgekehrter Reihenfolge der Deklarationen aufgerufen.
-
Kommt drauf an wessen leerer DTor das sein soll. Normalerweise werden Destruktoren aber nicht explizit aufgerufen (Ausnahmen bestaetigen die Regel), sondern implizit durch ein delete, oder wenn ein Objekt seinen Scpe verlaesst. Und ja, wenn ein Container zerstoert wird, werden es auch seine Insassen. Waer ja auch sinnlos, wenn die irgendwo namenlos im leeren Raum haengen. Aber Vorsicht: wenn du Pointer in einem Container aufbewahrst, werden nur die Pointer zerstoert, nicht aber die Objekte, worauf sie zeigen.
-
Hmm...
struct Struktur { float a; float b; }; ... class Klasse { private: std::vector<Struktur> vektor; public: Klasse() {} ~Klasse() {} PushElement(const Struktur& element) {vektor.push_back(element);} }; ... Klasse* objekt = new Klasse(); Struktur element1; Struktur element2; objekt.PushElement(element1); objekt.PushElement(element2); delete objekt; objekt = NULL;Der Dtor wird also von jedem Element im Vektor aufgerufen.
Nur wird der Speicher wirklich freigegeben?Mein Problem ist das er mit einem delete Fehler abbricht, wenn er scheinbar versucht ein Element zu löschen.
Was mache ich falsch? Kann er nicht einfach die Elemente löschen?
-
Argh, ich Esel.
Der delete Fehler war mein Fehler.Aber der Speicher alle Elemente müsste im Beispiel gelöscht werden, richtig?
-
mich wurde wundern wenn das ueberhaupt compiliert. Du hast einen Zeiger auf Klasse definiert und benutzt den . als Zugriffsoperator. bei Zeigern sollte man -> benutzen...
Abgesehen davon wird beim push_back das uebergebene Element kopiert und die Kopie im vector abgespeichert. Wird der vector zerstoert, werden auch die Kopien zerstoert, die Originale bleiben allerdings noch bestehen bis der scope verlassen wird.