2011-12-17 11 views
9

En mi aplicación wxWidgets, mientras ejecutaba en modo de depuración recibí este mensaje en Salida de Visual Studio 2010. La aplicación funcionó bien, y solo vi esto después de cerrarlo.Fugas de memoria detectadas

¡Fugas de memoria detectadas!

objetos de dumping ->

{9554} de bloque normal en 0x003CDCC0, 44 bytes de longitud.
de datos: < e n d> 20 C1 65 01 01 00 00 00 6E 00 00 00 9C CE 64 01

{9553} de bloque normal en 0x003CDB58, 8 bytes de largo.

datos: < D e <> 44 BD 65 01 C0 DC 3C 00
{9552} bloque normal en 0x003CDC50, 48 bytes de longitud.

datos: < e> A0 01 01 95 65 00 00 00 19 00 00 00 19 00 00 00

volcado objeto completo.

En mi programa no estoy asignando explícitamente memoria, sin embargo, el framework wxWidgets sí lo está. Recibí tal mensaje por primera vez, y no sé la causa exacta de ello.

¿Cómo puedo eliminar esta pérdida de memoria?

+1

publicar su código, preferentemente un programa mínimo que reproduce el problema – user1071136

+0

Desafortunadamente no puedo publicar un programa mínimo. Porque es un programa de GUI con varios archivos y un marco de GUI. No tengo idea de lo que está causando esto. Porque no he usado 'new' o' malloc' en ninguna parte. –

+0

Me temo que obtendrás más conjeturas que respuestas :) – user1071136

Respuesta

24

Simplemente tiene que agregar las siguientes líneas al principio 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 que tiene el objeto de dirección de bloque básica correcta, ya que pueden cambiar y asegurarse de que está compilando en _DEBUG.

Vea también: _CrtSetDbgFlag y _CrtSetBreakAlloc referencia de MSDN.

+1

Gracias, Lo que realmente funcionó para mí fue agregar '_crtBreakAlloc = 9609;' como una primera declaración. Para wxWidgets, tuve que agregarlo a la función 'OnInit()' de la aplicación principal. –

+2

Hola, ¿cómo se te ocurrió 9609? –

0

Tal vez algunos tipos de instancias estáticas todavía están asignados por el marco. Intenta resolverlo con un generador de perfiles como "devpartner".

+0

¿Se puede utilizar el mensaje de Visual Studio para obtener ayuda? –

+0

@VinayakGarg El puede ayudar, pero para un uso muy limitado. Los 'Datos 'enumerados son, de hecho, los contenidos de la dirección de la memoria, con los cuales se puede adivinar para qué se utiliza la memoria, y adivinar dónde se asigna. – fefe

+0

Él está usando Windows, por lo que Valgrind no funcionará aquí. –

0
  1. Nunca 'asuma' 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.

  2. Puede utilizar una herramienta como el corrector de límites (de Microfocus) para ayudar a identificar la pérdida de memoria porque le proporcionará 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í.

  3. 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 arreglen (con pasos de reprografía adecuados).

+1

Nunca dije que mi código es a prueba de fugas de memoria, es solo que no usé nuevo o malloc en mi código. Sí, tal vez debería intentar preguntar en el sitio wxWidgets. –

0

This wiki sugiere añadir lo siguiente a cada archivo de origen que tiene, después de todo, otra cabecera de incluir:

#ifdef __WXMSW__ 
    #include <wx/msw/msvcrt.h>  // redefines the new() operator 
#endif 

Esto dará lugar a fugas que se informa cuando finaliza el programa.

Más específicamente, asegúrese de llamar al ->Destroy() en todos los objetos que cree usando new (excepto tal vez su ventana superior).

0

Si la ubicación de la fuga reportada por contra es el mismo cada vez que se podría establecer un databreakpoint para ver cuando esta memoria se está cambiando y es de esperar averiguar quién se destinará esta memoria