"delete" Frage
-
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.
-
Klasse, ich danke, das sind ja fabelhafte Geschichten.Haste super erklärt.