virtual + delete this = crash???
-
Hallo!
Ich habe gerade ein ganz komisches Problem:class Base { public: void Release(){delete this;} }; class Test : public Base { void DoSth(){}; }; int main() { Test* T1 = new Test delete T1; // Funktioniert IMMER! Test* T2 = new Test; T2->Release(); // Crash bei virtual void DoSth return 0; }
Das funktioniert alles. Wenn ich aber statt 'void DoSth(){}' 'virtual void DoSth(){}' schreibe, reckt das Programm bei T2->Release() ab.
Folgendes funktioniert aber trotzdem:
class Test { virtual void DoSth(){}; public: void Release(){delete this;} }; int main() { Test* T = new Test; T->Release(); }
Also, ich check das nicht. Warum reckt das eine ab und das andere nicht??? Kann mir jemand weiterhelfen...
-
Hallo,
dein Programm hat undefiniertes Verhalten. Du löscht ein Objekt einer abgeleiteten Klasse (Test) über einen Basisklassenzeiger (Base) obwohl die Basisklasse *keinen* virtuellen Destruktor besitzt -> undefiniert.Spendiere der Basisklasse mal einen virtuellen Destruktor und dein Problem sollte sich erledigt haben:
class Base { public: void Release(){delete this;} virtual ~Base() {} };
-
Hey, super endlich funktioniert es.
Ich hab zwei Tage gebraucht um den Fehler vernünftig einzugrenzen... Mein MSVC++ hat bisher nie gemeckert (und auch keine Leaks erzeugt, glaube ich), wenn ich von einer Basisklasse aus delete this aufrufe. Deshalb hat mich das etwas verwirrt.