Wird ein in einer Funktion ersteller Vektor am ende gelöscht?
-
Hi, wenn ich einen Vektor in einer Funktion erstelle, wird dann am Ende der Funktion der Speicher wieder freigegeben?
Ich dachte eigentlich ja aber habe es noch einmal getestet:
#include <iostream> #include <vector> struct Test{ int a; Test * b; }; Test fun(){ std::vector<Test> v(42); v[40].a = 40; v[40].b = &v[41]; v[41].a = 23; return v[40]; } int main(){ Test d = fun(); std::cout << d.a << d.b->a << std::endl; }
Dabei kommt "4023" raus. Ist das nur weil es noch nicht überschrieben wurde oder geht das immer?
-
vektor schrieb:
Dabei kommt "4023" raus. Ist das nur weil es noch nicht überschrieben wurde oder geht das immer?
Ja.
Der Zugriff auf Objekte, deren Speicher freigegeben wurde, ist undefiniertes Verhalten. Undefiniertes Verhalten heisst, dass alles passieren kann, u.U. zufällig auch mal das, was erwartet wurde.
-
Danke
-
camper schrieb:
vektor schrieb:
Dabei kommt "4023" raus. Ist das nur weil es noch nicht überschrieben wurde oder geht das immer?
Ja.
Der Zugriff auf Objekte, deren Speicher freigegeben wurde, ist undefiniertes Verhalten. Undefiniertes Verhalten heisst, dass alles passieren kann, u.U. zufällig auch mal das, was erwartet wurde.
Ist es in dem oben gezeigten Beispiel nicht so, dass der Rückgabewert eine Kopie ist? Insofern wird der Inhalt von v[40] kopiert, zurückgegeben und dann wird erst der Vector zerstört.
Anders wäre es, wenn der Rückgabewert eine Referenz wäre. Verstehe ich da was falsch?
-
Die Rückgabe ist eine Kopie, aber
d.b->a
zeigt ja auf das a eines nicht kopierten Elementes aus dem vector - siehe Zeile 14.
-
v[40].b = &v[41];
Es geht nicht nur um ein Element.
-
Ok, stimmt. Danke.