std::vector und destruktor
-
wenn ich einen std::vector einer selbst erstellten klasse erstelle,
und ein element mit .clear(i) löschemuss ich dann einen destruktor definieren?
so etwas in der art delete?schließlich habe ich ja kein new aufgerufen?
bin anfänger also bitte einfach antworten
-
std::vector arbeitet mit dem Default-Konstruktor, dem Copy-Konstruktor, dem Destruktor und dem operator= der verwendeten Klasse.
die drei werden (wenn du sie nicht selbst deklarierst) vom Compiler generiert (sollte im C++-Buch deiner Wahl zur Genüge erläutert worden sein).Das bedeutet für dich: für die Verwendung von std::vector musst du nicht extra den Dtor definieren. ABER: Wenn du einen der Konstruktoren und/oder den op= selbst definiert hast (z.B. wenn deine Klasse eigenen dynamischen Speicher verwaltet), musst du höchstwahrscheinlich auch den Destruktor definieren, das gilt aber unabhängig davon ob du die Klasse im Zusammenhang mit std::vector benutzt oder nicht (nennt sich law of the big three).
-
hmm leider werden die containerklassen in meinen büchern nicht weiter erwähnt;
also um nochmal eine klare antwort zu erhalten;
wenn ich ein objekt aus dem vector lpösche , wird dessen konstruktor aufgerufen,
soweit so gutwenn in meiner klasse also keine zeiger vorkommen, entsteht auch kein memory-leak?
achja worauf ich noch keine antwort googlen konnte, wenn ich ein element lösche, werden dann die nachfolgenden objekte "verschoben"?
oder is da eine "leere" stelle?
-
bei einem erase werden alle nachfolgenden Segmente nach vorne geschoben. Will man das nicht, sollte man list verwenden
siehe dazu auch cplusplus.com:
<a href= schrieb:
http://www.cplusplus.com/reference/stl/vector/erase.html">Because vectors keep an array format, erasing on positions other than the vector end also moves all the elements after the segment erased to their new positions, which may not be a method as efficient as erasing in other kinds of sequence containers (deque, list).
-
gibt es einen trick wie man einfach rausbekommen kann, ob speicher zu spät freigegeben wird?
-
entweder er wird rechtzeitig freigegeben oder garnicht... zu spät gibts da nicht.
Es gibt aber tools die helfen können herauszufinden ob angeforderter Speicher auch wieder freigegeben wird. Am Besten ist es allerdings, gleich zu jeder Speicheranforderung auch an den entsprechenden Stellen die Freigabe einzubauen. Am leichtesten und sichersten ist das meist mit Smartpointern zu bewerkstelligen.