La soluzione di @Carlos è perfetta per problemi minori. Ma per problemi enormi, il rallentamento risultante a volte è qualcosa che non puoi sopportare.
In questo caso, si può posizionare
ASSERT(_CrtCheckMemory());
da qualche parte nel codice, dove si sospetta che il problema sia già presente. Questo comando controlla l'heap nel (e solo nel) punto in cui è inserito, e non dopo ogni new
o delete
chiamata come nel caso di _CRTDBG_CHECK_ALWAYS_DF
. Ciò mantiene il tempo di esecuzione ragionevole, rispetto all'opzione _CRTDBG_CHECK_ALWAYS_DF
.
Si può trovare la riga di codice problematica piuttosto rapidamente utilizzando un tipo di approccio di ricerca binaria per posizionare gli assert.
Tuttavia, a volte _CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF)
e/o _CrtCheckMemory()
non sono in grado di rilevare i problemi. Poi usando gflags
è un'altra possibilità, che è in grado di mostrare dove avviene la corruzione del mucchio. In poche parole:
- abilita l'heap della pagina (di solito avresti bisogno dei privilegi dell'amministratore ), ad esempio:
ci sarà un rapporto, quell'heap controlla"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /enable <full_path_to_exe_to_debug.exe> /full
exe_to_debug.exe
sono stati attivati. - esegui il programma nel debugger. Gli accessi fuori dai limiti, che danneggerebbero l'heap, porterebbero ora alla violazione dell'accesso e sono facilmente visibili nel debugger.
- disabilita l'heap della pagina una volta terminato il debug, ad esempio:
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /disable <full_path_to_exe_to_debug.exe>
- i programmi con controllo heap attivato possono essere elencati tramite
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p
Usa l'heap di debug e chiamalo all'inizio in main().
_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);
Rallenterà molto il programma ma dovrebbe interrompersi non appena si verifica il danneggiamento.
Fare riferimento a questo articolo per i dettagli:https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks