Debug error bei Speicherfreigabe



  • Hallo zusammen!

    Ich erzeuge dynamisch eine Klasse, auf welche im Programm global zugegriffen werden kann. Nachdem ihre Aufgabe in einer Funktion beendet ist, möchte ich sie am Ende dieser Funktion löschen und den Speicher freigeben. Beim Kompilieren und Linken meckert da auch keiner, aber wenn ich das Programm laufen lasse und es die oben genannte Klasse verwendet, endet der Debugger mit einem "Debug error" genau an der Stelle, an der der delete-Operator steht. Das Fenster des Errors sagt außerdem:
    "DAMAGE: after Normal block(#219) at 0x089D3B0"

    Kann mir leider keinen Reim daraus machen.
    Vielen Dank schonmal im Voraus!



  • Ich tippe mal auf unkontrolliertes Zeiger-Gefuchtel. Wie hast du denn den Speicher angelegt, verwendet und wieder freigegeben?


  • Mod

    Du kannst _heapchk oder AfxCheckMemory verwenden und entsprechende ASSERT in Deinem Code einbauen um die Stell zu finden in der Du vermutlich eine Speichergrenze überschreibst.



  • @ CStoll:
    Die Klasse wird ganz normal innerhalb einer Funktion durch den new-Operator erzeugt. Die Klasse enthält wiederum zwei Elemente, die direkt danach dynamisch erzeugt werden. Der Inhalt/Größe der Klassen sowie der Elemente ist auf jedenfall korrekt. Das Programm läuft auch einwandfrei, wenn ich den delete-Befehl weglasse und die Daten somit im Heap lasse. Möchte sie aber gerne daraus haben.

    @ Martin Richter:
    Sind die beiden genannten Dinge Zusatztools oder in VC++ enthalten? Und gibt es irgendwo nen Tutorial oder so, wie man die Sachen anwendet? Sorry, bin da noch ziemlich neu drin.



  • Neepomuk schrieb:

    @ CStoll:
    Die Klasse wird ganz normal innerhalb einer Funktion durch den new-Operator erzeugt. Die Klasse enthält wiederum zwei Elemente, die direkt danach dynamisch erzeugt werden. Der Inhalt/Größe der Klassen sowie der Elemente ist auf jedenfall korrekt.

    Na offenbar nicht, wenn dir der delete einen Fehler um die Ohren haut. Zeig doch mal etwas Code, damit ich den Fehler reproduzieren kann.

    *tippt spontan auf einen fehlenden Copy-Ctor oder op=*


  • Mod

    _heapchk und AfxCHEckMemory sind Funktionen aus der CRT bzw. MFC.
    Entsprechende Doku findest Du in der MSDN.
    http://msdn2.microsoft.com/en-us/library/y1132dee(VS.80).aspx
    http://msdn2.microsoft.com/en-US/library/2xse74he(VS.80).aspx

    Ein ASSERT(AfxCheckMemory()) würde sofort in dem Moment anschlagen, wenn der Speicher zerstört ist.

    Ansonsten müsstest Du etwas Code zeigen.



  • Vielen Dank für die Hilfe, Fehler ist gefunden!
    War was faul mit dem Abrufen des Speichers der Klasse!


Log in to reply