La solución de @Carlos es perfecta para problemas más pequeños. Pero para problemas grandes, la desaceleración resultante a veces es algo que no se puede digerir.
En este caso, uno puede colocar
ASSERT(_CrtCheckMemory());
en algún lugar del código, donde uno sospecha que el problema ya está presente. Este comando verifica el montón en (y solo en) el lugar donde se inserta, y no después de cada new
o delete
llamar como en el caso de _CRTDBG_CHECK_ALWAYS_DF
. Esto mantiene el tiempo de ejecución razonable, en comparación con la opción _CRTDBG_CHECK_ALWAYS_DF
.
Uno puede encontrar la línea de código problemática con bastante rapidez utilizando un tipo de enfoque de búsqueda binaria para colocar las afirmaciones.
Sin embargo, a veces _CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF)
y/o _CrtCheckMemory()
no son capaces de detectar problemas. Luego usando gflags
es otra posibilidad, que puede mostrar dónde ocurre la corrupción del montón. En pocas palabras:
- habilitar el montón de páginas (normalmente necesitarás privilegios de administrador ), por ejemplo:
habrá un informe, ese montón comprueba"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
fueron activados. - ejecutar el programa en el depurador. Accesos fuera de los límites, lo que corrompería el plomo del montón ahora para acceder a la violación y se ven fácilmente en el depurador.
- deshabilitar el montón de páginas una vez que se haya realizado la depuración, por ejemplo:
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /disable <full_path_to_exe_to_debug.exe>
- los programas con verificación de pila activada se pueden enumerar a través de
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p
Use el montón de depuración y llámelo desde el principio en main().
_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);
Ralentizará mucho el programa, pero debería romperse tan pronto como ocurra la corrupción.
Consulte este artículo para obtener más detalles:https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks