Was ist hier falsch
-
Hallo.
Hier erstmal der Code.
#include <iostream> using namespace std; class animal { int age; public: animal(int x=0): age(x) {} ~animal() {} int get() const { return age; } int set(int x) { age=x; } }; void main() { animal dog; cout<<dog.get()<<endl; dog.~animal(); cout<<dog.get()<<endl; // warum meldet mir der compiler hier keinen fehler? }
Und warum liefert mir diese letzte do.get() zeile eine Ausgabe, obwohl, dog doch gar nicht mehr exestiert?
-
Undefiniertes Verhalten heißt genau das. Wenn es bedeuten würde, dass das Programm abstürzen muß, wär es ja definiert.
Warum es funktioniert? Der Destruktor tut nichts, und das Objekt ist, obwohl formal ungültig, noch als Leiche im Speicher vorhanden. Die Methode get arbeitet also auf rohem Speicher, der noch die alten Daten enthält.
BTW gibts danach gleich nochmal undefiniertes Verhalten, weil der Destruktor beim verlassen der Funktion nochmal aufgerufen wird. Explizite Destruktoraufrufe verwendet man nur, wenn das Objekt mittels Placement-new erzeugt wurde.