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?
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à.