Domanda

So che questo è davvero generale, ma ottengo "questo" (vedi sotto), quando eseguo il mio file .c in Visual C ++ 2008 Express. Succede quando chiamo malloc (). Prendete il mio lavoro su questo - ho allocare dinamicamente la memoria correttamente.

  

MUCCHIO [Code.exe]: MUCCHIO: blocco Heap 211a10 modificata a 211af8 dopo che è stato liberato   Windows ha innescato un punto di interruzione in Code.exe.

     

Ciò può essere dovuto ad una corruzione del mucchio, che indica un bug in Code.exe o una qualsiasi delle DLL che ha caricato.

     

Questo può essere dovuto anche per l'utente preme F12 mentre Code.exe è l'elemento attivo.

     

La finestra di output può avere maggiori informazioni diagnostiche.

Perché ricevo questo errore? Che cosa significa questo anche significa?

È stato utile?

Soluzione

Il messaggio di errore ti dice esattamente il motivo per cui l'avete ottenuto:

  

blocco libero Mucchio 211a10 modificata a 211af8 dopo che è stato liberato

Hai avuto un blocco di heap allocata che è stato liberato poi qualcosa ha scritto a tale area di memoria. Non è bello scrivere su un blocco liberato della memoria.

Altri suggerimenti

L'errore non è in realtà accadendo Quando si chiama malloc; questo è solo quando si innesca una scansione gratuita mucchio. L'errore effettivo è accaduto da qualche parte prima. È malloced alcuni memoria all'indirizzo 211a10 (che è quello che malloc rispedito al mittente). Poi (o qualche altro lib) liberata. Poi più tardi, quando si chiama malloc in modalità debug, esegue la scansione del mucchio - a titolo di cortesia a te, il povero programmatore. Si scopre che qualcuno (il vostro o qualche lib si chiama) ha scritto su una parte di tale matrice, in particolare all'indirizzo 211af8, o byte 0xe8 nella matrice. Quindi stai sia ancora appeso su un puntatore che è stato liberato (più probabile) e usarlo, o sei solo cestinare memoria casuale.

Nel mio caso, con sintomi simili, la questione è stata la mancata corrispondenza di allineamento struct (opzione / Zp)

ho definito per il mio codice di un allineamento struct diverso da librerie esterne (wxWidgets). Tuttavia, wxWidgets è stato costruito con il makefile, così è stato compilato utilizzando il defaut / Zp. E wxWidget è linkato staticamente.

Si può fare, ma se si tenta di eliminare un oggetto wxWidgets classe dal codice il compilatore diventa confuso circa l'esatta dimensione dei membri struct. E durante l'esecuzione, si ottiene questo messaggio:

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

Soluzione:

  • Assicurarsi di utilizzare lo stesso "Struct Stati Allineamento" in tutto il codice e le librerie.

  • Best regola è quella di definire / ZP di utilizzare il valore "default". In Visual Studio, in Proprietà C / C ++ Generazione codice

  • MSDN citare: " Si consiglia di non utilizzare questa opzione a meno che non si hanno esigenze di allineamento specifici ." Vedi qui

  • Suggerimento: utilizzare #pragma pacchetto se avete bisogno di controllare l'allineamento in alcuni struct Vedi là

Esempio:

#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

*

Spero che questo aiuta spiegazione, perché questo non è in realtà un bug nel codice, ma un grave errore di configurazione: difficile da rilevare perché si trova nelle opzioni del compilatore sottili. Grazie per tutto,

    *
  

I allocare dinamicamente la memoria correttamente.

Credo che il problema qui è che si unallocate la memoria inproperly. Quello che voglio dire con questo è che, si potrebbe tentare di utilizzare memoria liberata. Mi dispiace non posso aiutare ulteriormente, probabilmente si potrebbe aggiungere il codice vero e proprio.

  

Prendete il mio lavoro su questo -. Ho allocare dinamicamente la memoria correttamente

Ma sei sicuro i vostri buffer sono tutte le dimensioni corrette e li free() correttamente? frees doppie e buffer overflow può facilmente portare a danneggiamento di heap che può causare malloc() a fallire in tutti i tipi di modi.

Se le strutture di gestione utilizzati internamente da malloc() danneggiati, di solito non portare ad un errore immediatamente. Ma più tardi chiamate a malloc() o free() che cercano di utilizzare queste strutture danneggiate non riuscirà fare cose imprevedibili.

Stai usando malloc () su un array? Perché I pensare l'errore potrebbe essere solo voi dimenticando di allocare un posizione in più di memoria alla fine - quello che succede è che tenta di scrivere in quella posizione, che non è assegnato ad esso, ed assume sta cercando di scrivere in un luogo che è stato liberato già.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top