Objekt lebt out-of-scope weiter
-
In folgendem Programm wird ein Objekt nicht richtig deallokiert:
struct Foo { int n; Foo() : n(42) { } ~Foo() { std::cout << "~Foo()" << std::endl; } void print() { std::cout << n << std::endl; } }; int main() { Foo *p; { Foo s; p = &s; } p->print(); return 0; }
~Foo() wird zwar aufgerufen, n hat aber immer noch den ursprünglichen Wert.
Und wenn ich das Objekt auf dem Heap erstelle:
{ Foo *s = new Foo(); p = s; delete s; }
dann läufts auch wie erwartet (bei mir n = 0xFEEEFEEE).
-
Undefiniertes Verhalten ist undefiniert.
Aber hier noch eine Erklärung, warum du dieses Verhalten beobachtest: Stackspeicher wird normalerweise nicht mit Debugwerten überschrieben, wenn er nicht mehr benötigt wird. Höchstens vielleicht als ganzes bei Rückkehr aus einer Funktion, aber nicht innerhalb einer Funktion.
-
Danke für die Erklärung!
-
Bzw. wenn du sehen willst dass "s" nimmer lebt, probier mal das:
int main() { Foo *p; { Foo s; p = &s; } { std::string x = "x"; } p->print(); return 0; }
Im Debug-Mode.
Wobei ich natürlich nicht *garantieren* kann dass dann ein anderer Wert ausgegeben wird. (Weil halt eben, wie SeppJ ja schon geschrieben hat, undefiniertes Verhalten eben undefiniert ist.) Sollte aber normalerweise so sein.