Frage

Ich weiß, dass dies wirklich allgemein ist, aber ich bekomme "das" (siehe unten), wenn ich meine .c -Datei in Visual C ++ 2008 Express ausführe. Es passiert, wenn ich anrufe malloc (). Nehmen Sie meine Arbeit daran - ich habe den Speicher dynamisch richtig zugewiesen.

Heap [Code.exe]: Heap: Kostenloser Heap -Block 211A10 bei 211af8, nachdem es befreit wurde, hat Windows einen Haltepunkt in code.exe ausgelöst.

Dies kann auf eine Korruption des Heaps zurückzuführen sein, der einen Fehler in Code.exe oder einer der geladenen DLLs anzeigt.

Dies kann auch darauf zurückzuführen sein, dass der Benutzer F12 drückt, während Code.exe den Fokus hat.

Das Ausgabefenster kann diagnostische Informationen enthalten.

Warum bekomme ich diesen Fehler? Was bedeutet das überhaupt?

War es hilfreich?

Lösung

Die Fehlermeldung zeigt Ihnen genau, warum Sie sie bekommen haben:

Kostenloser Heap -Block 211A10 modifiziert bei 211af8, nachdem es befreit wurde

Sie hatten einen haufen, der befreit wurde, dann schrieb etwas an diesen Speicherbereich. Es ist nicht schön, in einen befreiten Speicherblock zu schreiben.

Andere Tipps

Der Fehler ist eigentlich nicht Ereignis Wenn Sie Malloc anrufen; Das ist gerade dann, wenn es einen kostenlosen Heap -Scan auslöst. Der tatsächliche Fehler ereignete sich irgendwo zuvor. Sie haben einen Speicher an der Adresse 211A10 geformt (das ist, was Malloc zu Ihnen zurückgekehrt ist). Dann haben Sie (oder eine andere Lib) es befreit. Wenn Sie später Malloc im Debug -Modus anrufen, scannt es den gesamten Haufen - als Höflichkeit für Sie, den armen Programmierer. Es entdeckt, dass jemand (Ihr oder eine Lib, den Sie anrufen) über einen Teil dieses Arrays geschrieben hat, insbesondere unter der Adresse 211AF8 oder 0xE8 -Bytes in das Array. Sie hängen also entweder immer noch an einem Zeiger, der (höchstwahrscheinlich) befreit wurde, und benutzt ihn, oder Sie haben nur zufällige Speicher.

In meinem Fall war das Problem mit ähnlichen Symptomen die Strukturausrichtung (/ZP -Option)

Ich habe für meinen Code eine andere Strukturausrichtung definiert als externe Bibliotheken (WXWIDGETS). WxWidgets wurde jedoch mit dem Makefile gebaut, so dass es mit dem Defaut /ZP zusammengestellt wurde. Und wxWidget ist statisch verknüpft.

Sie können das tun, aber wenn Sie versuchen, ein WXWIDGETS-Klasse-Objekt zu löschen aus Ihrem Code Der Compiler ist verwirrt über die genaue Größe der Strukturelemente. Und beim Laufen erhalten Sie diese Nachricht:

HEAP[Code.exe]: HEAP: Free Heap block 211a10 modified at 211af8 after it was freed 
Windows has triggered a breakpoint in Code.exe.

Lösung:

  • Verwenden Sie unbedingt die gleiche "Struct -Mitgliedsausrichtung" in allen Code und Bibliotheken.

  • Die beste Regel ist es, /zp zu definieren, um den "Standard" -Wert zu verwenden. In Visual Studio unter den Eigenschaften C/C ++ Codeerzeugung

  • MSDN CITE: "Sie sollten diese Option nicht verwenden, es sei denn, Sie haben spezifische Ausrichtungsanforderungen." Siehe hier

  • Tipp: Verwenden #pragma Pack Wenn Sie die Ausrichtung in einigen Strukturen steuern müssenSchau dort

Beispiel:

#pragma pack(1) // - 1 byte alignment 

    typedef union 
    {   
        u64 i;
        struct{             // CUSTOMS.s is used by Folders
            u32  uidx;      // Id, as registered 
            byte isoS, isoT;    // isoS/isoT combination.
            byte udd0, udd1;    // custom values (TBD)
        }s;
    }CUSTOMS;

    struct Header   // exactly 128 bits
    {       
        u32 version;        
        u32 stamp;          // creation time
        CUSTOMS customs;                // properties 
    }

#pragma pack()  // this pragma restores the **default** alignment

*

Ich hoffe, diese Erklärung hilft, da dies kein Fehler im Code ist, sondern ein schwerwiegender Konfigurationsfehler: schwer zu erkennen, da sie sich in subtilen Compiler -Optionen befindet. Danke für alles,

    *

Ich habe den Speicher dynamisch richtig zugewiesen.

Ich denke, dass das Problem hier ist, dass Sie das Gedächtnis unerreicht. Damit meine ich, dass Sie versuchen könnten, Freed Memory zu verwenden. Entschuldigung, ich kann nicht weiter helfen, Sie könnten wahrscheinlich den tatsächlichen Code hinzufügen.

Nehmen Sie meine Arbeit daran - ich habe den Speicher dynamisch richtig zugewiesen.

Aber sind Sie sicher, dass Ihre Puffer die richtige Größe haben und Sie free() sie richtig? Double Frees und Pufferüberläufe können leicht zu einer Haufen Korruption führen, die verursachen können malloc() auf alle möglichen Arten scheitern.

Wenn die Verwaltungsstrukturen intern von verwendet werden von malloc() Beschädigt werden, es wird normalerweise nicht sofort zu einem Fehler führen. Aber später ruft an malloc() oder free() Dieser Versuch, diese beschädigten Strukturen zu verwenden, wird fehlgeschlagen.

Verwenden Sie Malloc () in einem Array? Weil ich denken Der Fehler könnte einfach sein, dass Sie vergessen, eine zuzuweisen zusätzlicher Speicherort am Ende - Was passiert, ist, dass es versucht, an diesen Ort zu schreiben, der ihm nicht zugeteilt wird, und vermutet, dass es versucht, an einen Ort zu schreiben, der bereits befreit wurde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top