"delete" Frage
-
Gehen wir mal davon aus wir haben folgenden Fall vorliegen:
class EineKlasse { } class Test { private: std::vector<EineKlasse*> zeigers; public: void einefunktion(int wert) { for(int i =0;i<wert;i++) { zeigers.push_back(new EineKlasse); } } ~Test() { //muss ich hier wieder jedes element im vector abbräumen? ála for(int i =0;i<zeigers.size();i++) { delete zeigers[i]; } } };Muss ich wie oben beschrieben, die Elemente nach dem "Gesetzt: Für jedes new ein delete" auch so wieder abräumen? Oder übernimmt das der Vector für mich?
-
Firefighter schrieb:
...
Muss ich wie oben beschrieben, die Elemente nach dem "Gesetzt: Für jedes new ein delete" auch so wieder abräumen? ...Ja.
Firefighter schrieb:
...
Oder übernimmt das der Vector für mich?Nein.
Der vector destruiert nur die Objekt, die sich in ihm befinden ... in diesem Fall Zeiger.Gruß,
Simon2.
-
Der Vector löscht nur die Pointer selbst, nicht die Objekte auf die sie zeigen. Musst du selbst übernehmen.
-
Ok alles klar, und der Dtor hat auch so seine richtigkeit, ja?
-
Firefighter schrieb:
Ok alles klar, und der Dtor hat auch so seine richtigkeit, ja?
Ja!
-
Ok danke, hab ichs mir doch richtig vorgestellt.
-
std::vector<std::auto_ptr<Kontobewegung> > bewegungen;Wenn ich das so gestalte(deklaration scheint noch fehlerhaft zu sein, da ich fehler bekomme) brauche ich mich später nicht über das aufräumem kümmern richtig`?
-
Theoretisch hast du da recht!
-
Firefighter schrieb:
Wenn ich das so gestalte(deklaration scheint noch fehlerhaft zu sein, da ich fehler bekomme) brauche ich mich später nicht über das aufräumem kümmern richtig`?
Falsch. auto_ptr ist wegen seiner Kopiersemantik nicht für die Container der Standardbibliothek geeignet.
-
EDIT: Ok MFK ich danke dir, das erklärt einige Fehler.
Mit den shared_ptr, hab ich recht? aber mal ne andere Frage, wenn meine deklaration wie oben aussieht, wie könnte dann ein pushback eines möglichen kontobewegung-zeiger aussehen?Die Referenz ist mir dabei gerade nicht sehr hilfreich

-
Kontenbewegung *bestechung = new Kontenbewegung(); bewegungen.push_back(bestechung);
-
Öhmm...nee ich glaube das meinte ich nicht...sondern ich meinte eher, wie es mit shared_ptr ausehen müsste?Weil mit den burschen hab ich noch net so viel erfahrung.
-
So?
bewegungen.push_back( shared_ptr<Kontenbewegung>( new Kontenbewegung() ) );
-
Ok das hilft mir schonmal weiter, und die Deklaration vom vector wäre dann so hier?:
std::vector< shared_ptr<Irgendwas> > vieles_irgendwas;?
-
Sieht ok aus.
-
Und auf die deklaration kann ich dein push_back anwenden? Kann doch eigentlich bei deinem push_back das führende shared<> zeugs weglassen und nur ein normales new machen oder nicht?
-
OK hat sich erledigt, habs alleine hinbekommen. Aber mal ne andere Frage, worin besteht nun der Underschied zwischen auto_ptr und shared_ptr?also aufjedenfall schonmal die Containerkompatiblität, und das shared_ptr sich ums aufräumen kümmert, aber was noch?
-
Ok hab mir auch das ebend selbst beantwortet, danke für eure Beiträge.
-
Vielleicht kannst du dir auch mal Boost.Pointer Container anschauen, da werden die Zeiger auch automatisch freigegeben.
-
Alles klar Nexus, danke für den Hinweis, kannste eventuell kurz erklären wo der signifikanteste Unterschied liegt?
-
Die Pointer-Container speichern intern gerade Zeiger (wie könnte es anders sein ;)). Es existieren die analogen Container zur STL, wie
ptr_vector,ptr_deque,ptr_listetc.Das führt zu verschiedenen Vorteilen für den Anwender:
- Die gespeicherten Elemente müssen im Gegensatz zu STL-Containern nicht kopierkonstruierbar oder zuweisbar sein.
- Bei Array-Containern wie
boost::ptr_vectorsind interne Operationen wie Löschungen und Einfügungen performanter, da nur Zeiger umgehängt werden. - Die Indirektion entfällt beim Aufruf. Man kann direkt schreiben
vec[1]odervec.front(), anstatt dass man noch einmal dereferenzieren muss.
Siehe auch hier.
P.S. Die ersten beiden Punkte beziehen sich auf den Vergleich zu STL-Containern mit Objekten, der dritte zu STL-Containern mit Smart-Pointern.