Řešení @Carlos's je ideální pro menší problémy. Ale u velkých problémů je výsledné zpomalení někdy něco, co nemůžete strávit.
V tomto případě lze umístit
ASSERT(_CrtCheckMemory());
někde v kódu, kde se předpokládá, že problém již existuje. Tento příkaz kontroluje haldu na (a pouze na) místě, kde je vložen, a ne po každém new
nebo delete
volání jako v případě _CRTDBG_CHECK_ALWAYS_DF
. To udržuje dobu provádění přiměřenou ve srovnání s volbou _CRTDBG_CHECK_ALWAYS_DF
.
Problematický řádek kódu lze najít velmi rychle pomocí přístupu binárního vyhledávání pro umístění argumentů.
Někdy však _CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF)
a/nebo _CrtCheckMemory()
neumí odhalit problémy. Poté pomocí gflags
je další možnost, která je schopna ukázat, kde dochází ke hromadění korupce. Stručně řečeno:
- povolit hromadu stránek (obvykle budete potřebovat oprávnění správce ), např.:
objeví se zpráva, že hromada kontroluje"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
byly aktivovány. - spusťte program v ladicím programu. Přístupy mimo meze, které by poškodily haldu, nyní vedou k narušení přístupu a jsou snadno viditelné v ladicím programu.
- po dokončení ladění deaktivovat hromadu stránek, např.:
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /disable <full_path_to_exe_to_debug.exe>
- Programy s aktivovanou kontrolou haldy lze zobrazit pomocí
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p
Použijte haldu ladění a zavolejte to úplně na začátku v main().
_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);
Velmi to zpomalí program, ale měl by se přerušit, jakmile dojde k poškození.
Podrobnosti naleznete v tomto článku:https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks