Am Mittwoch, 16. November 2005 22:50 schrieb Johanns Schneider: ja, das mit dem new delete stimm schonmal.
int main() { test Test = test(); Test.~test(); cout << "noch ist es nicht zu ende\n"; Test.say("fehler\n"); return 0; }
Hier wird nur der Destruktor aufgerufen, der aber das Objekt nicht explizit zerstört. Hast das ja am 2. Beispiel gesehen das das gar nicht erlaubt ist. Ausserdem triggert der Destruktor doch nicht das zerstören des Objekts, sondern wird von eben diesem ausgelöst oder sollte ich mich irren? Ansonsten ist der ja nix weiter als ne Memberfunktion. Wenn ich jetzt richtig informiert bin wird ein test Test doch automatisch auf dem Stack erstellt, ein test *Test dagegen nach der initialisierung mit new() im Freispeicher (Heap) bereitgestellt. Die lokale Variable wird wieder gelöscht, sobald man ihren Gültigkeitsbereich verlässt. Und auf diesen Speicherbereich wird delete wohl keine Zugriffsrechte haben, darum der Speicherzugriffsfehler. test *Test = new test(); delete Test; cout << "noch ist es nicht zu ende\n"; Test->say("fehler\n"); wird zwar so auch funktionieren, ist allerdings sehr gefährlich. Denn der Speicher ist ja nicht mehr reserviert. Es funktioniert hier nur, weil noch keine andere Variable sich diesen Speicherbereich geschnappt hat (und delete die instanzen ja nicht auf 0 setzt) daher sieht man ja häufig sowas: delete Test; Test = NULL; um ungewollten zugriff auf das Objekt sofort feststellen zu können.