delete this - VC++ Problem?



  • Hallo zusammen!

    Nach langem hin und her, habe ich mich dazu entschlossen, doch delete this in meinem Programm zu benutzen. Hab dabei natürlich auch auf alles geachtet, was eine Benutzung von delete this legitimiert. So, und nun das für mich unglaubliche:
    Bei folgendem Code bekomme ich einen Laufzeitfehler "Debug Error". "Damage after Normal block"

    void Brute::die ()
    {
    	if (points <= 0)		//	Sterben ???
    	{		
    		pField->DeleteField (getX(),getY(),this);
    
    		delete this;
    	}
    }
    

    Während:

    void Brute::die ()
    {
    	if (points <= 0)		//	Sterben ???
    	{		
    		pField->DeleteField (getX(),getY(),this);
    
    	         //weiß gott wieso....
    		Creature* p=this;
    		delete p;
    	}
    }
    

    reibunglos arbeitet. Creature ist dabei eine Oberklasse von Brute.
    pField hat auch keinen Einfluss auf das delete, ein auskommentieren verursacht das selbe seltsame Verhalten.

    Weiß jemand wie das sein kann?
    VC++ 6.0 Problem?



  • Hm, Creature::~Creature ist aber schon virtual? Ansonsten sehe ich spontan keinen Unterschied.



  • ist Creature::~Creature virtual?
    €dit: fast-simultan mit opvoid



  • Oh, danke, das habe ich nicht gewusst mit dem Destruktor. Werde das gleich mal probieren, wird wohl gehen.
    Aber wieso muss der Destruktor eigentlich virtual sein?
    Weil nach meinem Verständnis bedeutet dies ja, dass wenn ich einen Zeiger vom Typ einer Oberklasse (z.B. Creature) habe, und dieser auf ein Objekt einer Unterklasse (z.B. Brute) zeigt, bei nicht virtuellem Destruktor der Destruktor von Creature, ansonsten aber der von Brute aufgerufen wird. Oder?
    Wieso bekomme ich dann bei

    delete this;

    einen Fehler und bei

    Creature* p=this;
    delete p;

    keinen?

    Beim oberen wird durch das delete this wahrscheinlich der Destruktor von Brute aufgerufen, richtig? Müsste doch eigentlich korrekt sein?
    Beim unteren dagegen der Destruktor von Creature... was ja eigentlich nicht korrekt ist?

    Kann nmir das mal einer erklären 🙂



  • Creature* p = this;
    delete this;
    

    Das ruft inkorrekter Weise nicht ~Brute auf, sondern nur ~Creature. Wenn die korrekte Version also einen Fehler liefert, kommt der wahrscheinlich aus ~Brute. Wie sieht der Code da aus?



  • Ja, genau das meinte ich ja.

    Der Destruktor von Brute:

    Brute::~Brute ()
    {
    	--bruteCount;
    }
    

    Wobei bruteCount eine statische Membervariable ist. Dabei dürfte es doch eigentlich legitim sein, auf diese auch nach dem Aufruf von delete this zuzugreifen. Auch kann der Fehler hier nicht liegen, weil ich habe die Zeile selber auch auskommentiert, und dann ging es immer noch nicht.



  • Hm, hast du schon mit Haltepunkten und Einzelschritten nachgeguckt, ob der Fehler nicht um drei Ecken woanders her kommt?



  • operator void schrieb:

    Hm, hast du schon mit Haltepunkten und Einzelschritten nachgeguckt, ob der Fehler nicht um drei Ecken woanders her kommt?

    Ja, habe ich. Ich habe sogar schon alle anderen Funktionen außer die() auskommentiert. Ging immer noch nicht. Mich hat das zur Verzweiflung getrieben...



  • Kannst du dann mal ein minimales Beispielprogramm bauen, in dem dieser Fehler auftritt?



  • Ohh... ich habs schon.
    Ganz einfach:
    Im Konstruktor habe ich in einem Vektor seinen Speicherbereich überzogen. Also über den [] Operator auf Speicher zugegriffen, der nicht existierte. 😕 Der Fehler hat sich eben jetzt erst im Destruktor gezeigt. Und das alles nur weil eine Konstante falsch definiert war.

    ALso merci, nun geht es.


Anmelden zum Antworten