Fehlermeldung von Visual Studio



  • Hallo zusammen,

    ich bekomme nachdem mein Programm fertig ist folgende Fehlermeldung:

    Expression: _CrtIsValidHeapPointer(block)

    Was bedeutet das?

    PS: Das Programm funktioniert einwandfrei, die Meldung kommt ganz am ende.



  • @C91
    Dass ein Fehler aufgetreten ist.
    Mal ehrlich: Was sollen wir damit anfangen? Kein Kontext, kein Quelltext, nix, und du willst ne Antwort?



  • @C91 sagte in Fehlermeldung von Visual Studio:

    Das Programm funktioniert einwandfrei,

    Das muss nicht heißen, dass es auch richtig läuft.
    Ein oder mehrere free() vergessen merkt man nicht unbedingt, ist aber totzdem falsch.



  • @DocShoe Mit der Meldung kann man sehr wohl was anfangen, deutlich mehr als nur zu sagen "dass ein Fehler aufgetreten ist".

    @DirkB Ein vergessenes free kann nicht der Grund sein. Ein free zu viel (Dinge freigeben die später nochmal freigegeben werden) könnte dagegen möglicherweise der Grund sein.



  • @C91 sagte in Fehlermeldung von Visual Studio:

    Expression: _CrtIsValidHeapPointer(block)

    _CrtIsValidHeapPointer überprüft ob der übergebene Zeiger ein gültiger "Heap-Zeiger" ist - also ob er auf den Anfang eines Speicherbereichs zeigt der am Heap angefordert wurde und noch nicht wieder freigegeben. Diese Überprüfung ist fehlgeschlagen - an einer Stelle wo ein gültiger Heap-Zeiger erwartet wird. z.B. bei einem Aufruf von free.

    Dafür gibt es mehrere mögliche Gründe:

    1. Der Zeiger ist überhaupt ungültig.
    2. Der Zeiger ist gültig, zeigt aber nicht auf Speicher der vom Heap gekommen ist.
    3. Der Zeiger war mal ein gültiger Heap Zeiger, wurde aber schon freigegeben.
    4. Etwas in deinem Programm hat die internen Datenstrukturen des Heaps überschrieben. D.h. _CrtIsValidHeapPointer arbeitet mit kaputten Daten und kann daher zu einem falschen Ergebnis kommen.

    Je nachdem in welcher Funktion diese Meldung ausgegeben wird kann man einige dieser Möglichkeiten ausschliessen oder auch nicht.

    D.h. Schritt 1 wäre das Programm im Debugger auszuführen und sich den Call-Stack dieser Meldung anzusehen.

    Um die Stelle zu finden die den Fehler verursacht kannst du dein Programm auch mit "Address Sanitizer" ausfürhen: https://devblogs.microsoft.com/cppblog/address-sanitizer-for-msvc-now-generally-available/
    Damit solltest du recht gute Chancen haben die problematische Stelle zu finden.



  • @hustbaer Das freewar nur ein Beispiel dafür, dass ein Programm funktioniern kann, aber dennoch falsch ist.


Log in to reply