c++ - Fugas de memoria detectadas
visual-studio-2010 memory-leaks (5)
Solo tiene que agregar las siguientes líneas al comienzo de su función principal. Al agregar esta marca, Visual Studio se dividirá en la línea que crea la pérdida de memoria.
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
_CrtSetBreakAlloc(9554);
_CrtSetBreakAlloc(9553);
_CrtSetBreakAlloc(9552);
Asegúrese de tener la dirección de bloque normal del objeto correcto porque pueden cambiar y asegurarse de que está compilando en _DEBUG.
Ver también: _CrtSetDbgFlag y _CrtSetBreakAlloc Referencia de MSDN.
En mi aplicación wxWidgets, mientras corría en modo de depuración recibí este mensaje en Output of Visual Studio 2010. La aplicación funcionó bien, y solo vi esto después de cerrarlo.
¡Fugas de memoria detectadas!
Volcar objetos ->
{9554} bloque normal en 0x003CDCC0, 44 bytes de longitud.
Datos: <end> 20 C1 65 01 01 00 00 00 6E 00 00 00 9C CE 64 01{9553} bloque normal en 0x003CDB58, 8 bytes de longitud.
Datos: <D e <> 44 BD 65 01 C0 DC 3C 00
{9552} bloque normal en 0x003CDC50, 48 bytes de longitud.Datos: <e> A0 95 65 01 01 00 00 00 19 00 00 00 19 00 00 00
Volcado de objetos completo.
En mi programa, no estoy asignando explícitamente memoria, sin embargo, el marco wxWidgets sí lo está. Recibí tal mensaje por primera vez, y no sé la causa exacta de ello.
¿Cómo puedo deshacerme de esta fuga de memoria?
Nunca simplemente ''suponga'' que su código es a prueba de fugas de memoria. A menos que seas uno de los semidioses de programación, nadie es inmune a la posibilidad de escribir fugas de memoria.
Puede usar una herramienta como el corrector de límites (desde Microfocus) para ayudar a identificar la pérdida de memoria porque le dará una pila de llamadas. El informe de pérdida de memoria que obtuvo del depurador CRT solo le dice que la memoria se filtró en una dirección particular. Un producto como checker de límites le dará una pila de llamadas para esa pérdida de memoria, junto con muchas otras cosas. Existen otras herramientas de pérdida de memoria en el mercado, pero no intentaré enumerarlas aquí.
Si está seguro de que la pérdida de memoria se debe a ''wxWidgets'', entonces quizás deba informar a los autores de esa biblioteca y quizás lo solucionen (con pasos de reprografía adecuados).
Quizás algunos tipos de instancias estáticas todavía están asignados por el marco. Intenta resolverlo con un generador de perfiles como "devpartner".
Si la ubicación de la fuga informada por vs es la misma cada vez que puede establecer un punto de corte de datos para ver cuándo se está modificando esta memoria y con suerte averiguar quién está asignando esta memoria
Este wiki sugiere agregar lo siguiente a cada archivo fuente que tengas, después de todos los demás encabezados:
#ifdef __WXMSW__
#include <wx/msw/msvcrt.h> // redefines the new() operator
#endif
Esto dará lugar a filtraciones que se informarán cuando finalice su programa.
Más específicamente, asegúrese de llamar a ->Destroy()
en todos los objetos que cree usando new
(excepto tal vez su ventana superior).