Assicurarsi che tutte le librerie a cui si sta collegando siano compilate nella stessa versione CLR dell'applicazione in esecuzione, tutto in Versione o tutto in Debug.
Quando si compila in Debug e Release si stanno effettivamente prendendo di mira due diverse versioni della libreria di runtime C. Queste versioni sono abbastanza diverse e utilizzano strategie diverse per allocare memoria e utilizzano diversi heap. Ma la cosa più importante da sapere è che NON sono compatibili tra loro.
La libreria di runtime Release C ha allocato la memoria come previsto, mentre il Debug aggiungerà informazioni extra, come i blocchi di guardia per tracciare l'overflow del buffer e la posizione che ha chiamato la funzione di allocazione, e a sua volta assegna più memoria rispetto alla Release.
Se stai collegando la tua applicazione a un mix di DLL che sono state create in Release e Debug, molto probabilmente finirai per provare a eliminare un oggetto in un CLR che è stato creato in un altro. Ciò significa che tenterai di liberare più o meno memoria di ciò che è stato assegnato all'oggetto e questo può corrompere l'heap.
È necessario creare l'applicazione, nonché allegare alle librerie che sono costruite con la stessa configurazione, Release o Debug.
Questo problema può verificarsi in particolare nei moduli che vengono compilati con diversi compilatori.
C'è un modo per aggirare, che menzionerò ma non lo consiglio. Se per qualche motivo hai ancora bisogno di costruire in diverse modalità, questa soluzione consentirà di allocare e liberare tutta la memoria dallo stesso heap condiviso. L'API GetProcessHeap ti consentirà di accedere all'heap condiviso attraverso i diversi moduli. Utilizzando HeapAlloc & HeapFree è possibile allocare e liberare memoria nell'heap condiviso. Nota: HeapAlloc e HeapFree dovrebbero sostituire tutte le chiamate a malloc e gratuite nella propria applicazione.
fonte
2017-01-17 12:38:48
La lingua è mista C/C++. L'indirizzo danneggiato è diverso in ogni sessione di debug, quindi suppongo che non sia possibile utilizzare un punto di interruzione dei dati – Danne
Purtroppo hai ragione. In questi casi, il mio approccio è quello di #define free/delete per essere nulla. Se il problema scompare, #define malloc/new/free/delete a una funzione che registra ogni chiamata, al fine di trovare cancellazioni o eliminazioni duplicate senza allocazione. – Timores