Wie Zugriffsverletzungen debuggen ?



  • Ich bekomme beim Beenden der Anwendung die Meldung

    Unbehandelte Ausnahme bei 0x1021c2b2 (msvcr80d.dll) in LightModulator2D.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xccccccc8.

    Ich habe nach fehlenden delete Anweisungen gesucht, aber keine Fehler gefunden.
    Jetzt weiß ich nicht mehr wie ich weiter nach dem Fehler suchen soll.

    Matthias



  • Evtl ließt du ja irgendwo über den reservierten Speicher oder so...



  • Ein fehlendes delete verursacht im Normalfall keine Zugriffsverletung, ein fehlendes new unter Umständen schon.

    Bei solchen fehlern im Debugger herausfinden wo er auftritt (notfalls singlesteppen oder stacktrace (mit deinem Debugger!) und da dann den Zeiger (warscheinlich, auch Arrays sind Zeiger) rückverfolgen wo der erzeugt wird, wo überall Zerstört usw



  • darthdespotism schrieb:

    Ein fehlendes delete verursacht im Normalfall keine Zugriffsverletung, ein fehlendes new unter Umständen schon....

    Kann nicht auch ein doppeltes delete eine auslösen ?
    (OK - ich weiß: Theoretisch kann es ALLES auslösen ! Ich meine: Wurde das nicht schonmal als Ursache für eine Zugriffsverletzung entdeckt ?)

    Gruß,

    Simon2.



  • Dem Adresswert zu urteilen, greifst du auf einen nicht initialisierten Zeiger zu bzw. übergibst diesen an ein fremdes Modul. Das wird aber nicht durch ein fehlendes delete, sondern vielmehr durch ein fehlendes new hervorgerufen. Es gibt natürlich auch noch andere Ursachen für den Problem. Mit einem Debugger ( ➡ Call Stack) sollte es problemlos möglich sein, sofern sich der Fehler reproduzieren lässt, wo sich die entsprechende Fehlerstelle in deinem Code befindet.

    @Simon2
    Ein doppeltes delete verursacht auch Probleme. Ich würde das hier aufgrund des Adresswertes aber erstmal ausschliessen.



  • Es war ein delete bei fehlendem new. Ich habe im Konstruktor den Pointer jetzt auf NULL gesetzt und prüfe darauf im Destruktor.

    Matthias



  • pospiech schrieb:

    Es war ein delete bei fehlendem new. Ich habe im Konstruktor den Pointer jetzt auf NULL gesetzt und prüfe darauf im Destruktor.

    Du darfst auch gerne 0 statt NULL verwenden, und vor dem delete auf 0 zu prüfen ist sinnlos.



  • finix schrieb:

    pospiech schrieb:

    Es war ein delete bei fehlendem new. Ich habe im Konstruktor den Pointer jetzt auf NULL gesetzt und prüfe darauf im Destruktor.

    ... und vor dem delete auf 0 zu prüfen ist sinnlos.

    Warum ?

    Matthias



  • Weil eine delete auf einen Null-Zeiger sicher ist und laut Standard definitiv keine Probleme verursacht.


Anmelden zum Antworten