Vector-Klasse
-
Hallo C++-Gemeinde,
wenn ich auf einen Vector die "clear"-Operation aufrufe. Werden dann automatisch alle Objekte im Vektor zerstört und der Speicherplatz freigegeben, oder werden lediglich die Zeiger vom Vektor auf die Objekte entfernt?
Schonmal besten Dank
Gruß
Jochen
-
Wenn man .clear() aufruft, werden alle Elemente gelöscht. D.h. es werden die Standartdestruktoren dafür aufgerufen. Im Fall primitiver Typen, wie z.B. int, double usw. - kein Problem. Wenn der Typ eine STD-Klasse ist, z.B. string, bitset usw - auch kein Problem, denn sie besitzen schöne Destruktoren.
Wenn der Typ ein Zeiger ist, dann wirst du ein Problem haben, denn die Destruktorfunktion vom Zeiger ist wie bei den primitiven Typen.
Es gibt 2 Möglichkeiten:for(std::vector<T*>::iterator it = v.begin(); it != v.end(); ++it) delete *it; v.clear();//fakultativ, sogar auch doof!Man kann auch clevere Zeiger benutzen - wie z.B. shared_ptr.
-
Ich hoffe, ich habe das jetzt richtig verstanden.
Ich speichere an sich in dem Vektor Objekte. Das heißt ja im Prinzip, dass in der Liste aber nur "Zeiger auf Objekte" angelegt werden, oder?
Deshalb verwirrt mich deine Aussage.
zum Beispiel:
class Klassenname{ ... } ... vector<Klassenname> vectorName;Wenn ich dich richtig verstehe, werden bei dieser Konstruktion die Objekte definitiv freigegeben, wenn ich clear aufrufe, richtig?
Auf jeden Fall vielen Dank für deine schnelle Antwort
Gruß
Jochen
-
JoKl, ja - genau. Dein Beispiel ist ganz in Ordnung. Wenn du .clear() aufrufst, dann wird die Destruktorfunktion deiner Klasse aufgerufen - für jedes eingefügte Element. Wenn "Klassenname" nur primitive/STD Datentypen enthält, dann brauchst du sogar überhaupt keine Destruktorfunktion zu schreiben!
Das heißt ja im Prinzip, dass in der Liste aber nur "Zeiger auf Objekte" angelegt werden, oder?
Im Prinzip werden Kopien von den Objekten gespeicher. Wo siehst du hier Zeiger?