Es gibt zwei verschiedene Dinge hier:
- Objekt Lebensdauer
- Speicherdauer
Zum Beispiel:
{
vector<MyObject> v;
// do some stuff, push some objects onto v
v.clear(); // 1
// maybe do some more stuff
} // 2
Bei 1
, Sie klar v
: das alles zerstört die Objekte, die es gespeichert hat. Jeder bekommt seinen Destruktor aufgerufen, wenn du einen geschrieben hast und alles, was zu diesem MyObject
gehört, ist jetzt freigegeben. Jedoch, Vektor v
hat das Recht, den rohen Speicher herum zu behalten, wenn Sie es später wünschen.
Wenn Sie zwischen 1
und weitere Dinge hineinschieben, spart dies Zeit, da der alte Speicher wieder verwendet werden kann.
Bei 2
, der Vektor v
geht out of scope: alle Objekte, die Sie hineingeschoben, da 1
zerstört werden (als ob Sie ausdrücklich klar wieder genannt würden), aber jetzt ist der zugrunde liegende Speicher wird auch freigegeben (v
won‘ t sein, um es wiederzuverwenden).
Wenn ich das Beispiel ändern, so v
einen Zeiger wird, müssen Sie es explizit löschen, wie der Zeiger auf 2
out of scope gehen, dass nicht für Sie tun. Es ist besser, etwas wie std::unique_ptr
in diesem Fall zu verwenden, aber wenn Sie nicht und v
durchgesickert ist, wird der Speicher, den es zugeteilt hat, auch geleakt. Wie oben müssen Sie sicherstellen, dass v
gelöscht ist, und der Aufruf clear
ist nicht ausreichend.
Es gibt nichts anderes als den ersten Fall, außer dass es auf einen Vektor zeigt. Ich denke, diese Frage sollte erweitert werden, damit Sie verstehen, wie die Speicherzuteilung/-freigabe funktionieren sollte, und wahrscheinlich auch Hinweise. – Marlon
Dieser sagt, dass die Deklaration in einem Funktionsstapel automatisch den Destruktor beim Schließen aufruft. https://stackoverflow.com/questions/3054567/right-way-to-deallocate-an-stdvector-object –