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. 🙄


Anmelden zum Antworten