Die Lösung von @Carlos ist perfekt für kleinere Probleme. Aber bei großen Problemen ist die resultierende Verlangsamung manchmal etwas, das Sie nicht ertragen können.
In diesem Fall kann man
platzierenASSERT(_CrtCheckMemory());
irgendwo im Code, wo man das Problem bereits vermutet. Dieser Befehl überprüft den Heap an (und nur an) der Stelle, an der er eingefügt wird, und nicht nach jedem new
oder delete
Aufruf wie im Fall von _CRTDBG_CHECK_ALWAYS_DF
. Dies hält die Ausführungszeit im Vergleich zu Option _CRTDBG_CHECK_ALWAYS_DF
angemessen .
Man kann die problematische Codezeile ziemlich schnell finden, indem man eine Art binäre Suche zum Platzieren der Behauptungen verwendet.
Manchmal jedoch _CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF)
und/oder _CrtCheckMemory()
sind nicht in der Lage, Probleme zu erkennen. Dann mit gflags
ist eine weitere Möglichkeit, die zeigen kann, wo die Heap-Korruption passiert. Kurz gesagt:
- Seitenheap aktivieren (normalerweise benötigen Sie Admin-Privilegien ), z. B.:
es wird einen Bericht geben, dass der Heap nach"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
sucht aktiviert wurden. - Programm im Debugger ausführen. Zugriffe außerhalb der Grenzen, die den Heap beschädigen würden, führen nun zu einer Zugriffsverletzung und sind im Debugger leicht zu erkennen.
- Seitenheap deaktivieren, sobald das Debuggen abgeschlossen ist, z. B.:
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /disable <full_path_to_exe_to_debug.exe>
- Programme mit aktiviertem Heap-Check können über
aufgelistet werden"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p
Verwenden Sie den Debug-Heap und rufen Sie diesen ganz am Anfang in main() auf.
_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);
Es wird das Programm stark verlangsamen, aber es sollte brechen, sobald eine Beschädigung auftritt.
Einzelheiten finden Sie in diesem Artikel:https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks