Cómo usar la depuración CRT para detectar pérdidas de memoria en VC++ 6.0No había manera, así que me sumergí en la biblioteca de MSDN para buscar y no me tomó mucho tiempo encontrar básicamente la respuesta. ... Primero, las herramientas básicas para detectar pérdidas de memoria son el depurador y la funcionalidad del montón de depuración CRT. Para utilizar las funciones del montón de depuración, debe agregar la siguiente declaración al programa que desea detectar pérdidas de memoria y depurar: #define _CRTDBG_MAP_ALLOC #include #include #include "debug_new.h" MSDN dice: "Debe asegurarse de que el orden de declaración es el mismo que el anterior. Si cambia el orden, es posible que no funcione correctamente". No sabemos por qué sucede esto, pero los jefes de MS tienden a ser así de misteriosos. Para programas que no son MFC, agregue el archivo de encabezado de depuración: debug_new.h. Por supuesto, sin agregar esta oración, también se puede detectar la pérdida de memoria, pero no se puede determinar en qué archivo de programa fuente ocurre la pérdida. La salida solo puede indicarle que hay una pérdida de memoria en algún lugar de crtsdb.h. REG_DEBUG_NEW no funciona cuando pruebo. Los archivos que pierden asignaciones de memoria se detectarán con o sin esta macro. En segundo lugar, después de agregar la declaración anterior, agregue el siguiente código al programa para informar información de pérdida de memoria: _CrtDumpMemoryLeaks(); Después de agregar estas trampas al código de muestra de Zhou Xingxing, vi el volcado de pérdida de memoria esperado en la página de depuración de la ventana de salida de la sesión de depuración de VC++ (presione F5 para ejecutar la depuración): ¡Pérdidas de memoria detectadas! Volcado de objetos -> c:/Program Files/.../include/crtdbg.h(552): {45} Bloque normal, ubicado en 0x00441BA0, 2 bytes de longitud: 41 42 c:/Program Files/.../data : < C > 00 43 00 c:/Program Files/.../include/crtdbg.h(552): {43} Un bloque normal de 40 bytes de longitud en 0x00441C20. Datos: < C > E8 01 43 00 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0 00 00 00 00 00 00 00 00 00 Volcado de objeto completado. Para obtener más detalles, consulte los archivos de código fuente adjuntos a este artículo. La siguiente es mi respuesta a "¿Cómo utilizar la función de depuración CRT para detectar pérdidas de memoria? Espero que te sea útil. Si tu nivel de inglés es bueno, no es necesario que sigas leyendo, te recomiendo que leas el artículo técnico original en la biblioteca MSDN Programación C/C++ Una de las características más poderosas de un lenguaje es la capacidad de asignar y liberar memoria dinámicamente, pero hay un viejo dicho chino: "La mayor ventaja puede ser también la mayor desventaja", y C/. Las aplicaciones C++ son la mejor prueba de esta afirmación. El manejo inadecuado de la memoria asignada dinámicamente es uno de los problemas más comunes en el desarrollo de aplicaciones C/C++. Uno de los errores más esquivos y difíciles de encontrar es no liberar correctamente la memoria previamente asignada. Error Si bien una pequeña pérdida de memoria ocasional puede pasar desapercibida, un programa que pierde mucha memoria, o un programa que pierde cada vez más, puede mostrar signos de todo, desde un rendimiento deficiente (degradación gradual) hasta un agotamiento total de la memoria. un programa que pierde memoria puede consumir mucha memoria, provocando que otro programa falle, dejando al usuario incapaz de encontrar la fuente real del problema. Afortunadamente, incluso una pérdida de memoria inofensiva puede ser un desastre. (CRT) nos proporciona una forma eficaz de detectar e identificar pérdidas de memoria.
Comparta conmigo los siguientes hallazgos: ¿Cómo utilizar la función de depuración CRT para detectar pérdidas de memoria? ¿Cómo habilitar el mecanismo de detección de pérdidas de memoria? Uso de _CrtSetDbgFlag para configurar el modo de informe CRT para interpretar los tipos de bloques de memoria ¿Cómo establecer un punto de interrupción en un número de secuencia de asignación de memoria? ¿Cómo comparar el estado de la memoria? Conclusión ¿Cómo habilitar el mecanismo de detección de pérdidas de memoria? De forma predeterminada, el IDE de VC++ no habilita el mecanismo de detección de pérdida de memoria, lo que significa que incluso si hay una pérdida de memoria en un fragmento de código, la página de depuración de la ventana de salida de la sesión de depuración no generará información sobre la pérdida de memoria. Para habilitar la detección de pérdidas de memoria, se deben configurar dos mecanismos básicos. Una es utilizar las funciones del montón de depuración: #define _CRTDBG_MAP_ALLOC #include #include Nota: el orden de las declaraciones #include. Si cambia el orden, es posible que las funciones utilizadas no funcionen correctamente. Al incluir el archivo de encabezado crtdbg.h, las funciones malloc y free se pueden asignar a sus versiones de "depuración", _malloc_dbg y _free_dbg, que rastrean la asignación y liberación de memoria. Esta asignación solo es válida para compilaciones de depuración (es decir, _DEBUG está definido). Las versiones de lanzamiento utilizan malloc normal y funciones gratuitas. Las declaraciones #define asignan versiones base de funciones de montón CRT a las versiones de "depuración" correspondientes. Esta declaración no es obligatoria, pero la información sobre pérdidas de memoria estará incompleta sin ella. El segundo método es agregar la siguiente declaración para generar información sobre pérdidas de memoria cuando es necesario detectarlas: _CrtDumpMemoryLeaks(); Cuando el programa se ejecuta bajo el depurador, _CrtDumpMemoryLeaks mostrará la pérdida de memoria en la página de depuración de la ventana de salida. Por ejemplo, ¡se detecta una pérdida de memoria! Vaciado de objetos ->C:/Temp/memleak/memleak.cpp(15): {45} bloque normal en 0x00441BA0, 2 bytes de longitud. Datos: 41 42 c:/program files/microsoft visual studio/vc98/include/crtdbg. h(552): {44} Bloque normal ubicado en 0x00441BD0, 33 bytes de longitud. Datos: < C > 00 43 00 CD CD CD CD Objetos CD -> {45} Bloque normal ubicado en 0x00441BA0, 2 bytes de longitud: 41 42 {44} Bloque normal ubicado en 0x00441BD0, 33 bytes de longitud. 43 00 CD CD CD CD CD CD CD No se puede saber en qué archivo de programa fuente se produce la pérdida de memoria. Comprobemos el formato de la salida.