c++ visual-studio memory-leaks crt

C++-Prueba de pérdida de memoria con_CrtDumpMemoryLeaks()-No genera números de línea



visual-studio memory-leaks (5)

Estoy trabajando en un juego con SDL en Visual Studio 2010. Encontré la macro _CrtDumpMemoryLeaks() y pensé en darle una oportunidad. Al invocar _CrtDumpMemoryLeaks() se imprimen pérdidas de memoria en la ventana de salida, pero no muestra dónde sucede.

He leído el artículo de MSDN en Habilitación de detección de fugas de memoria , y explica que si defino _CRTDBG_MAP_ALLOC , debería mostrar el número de línea de la declaración ofensiva. Esto no sucede en mi caso. (Sin embargo, pude hacerlo funcionar si uso malloc () directamente, no utilizando ''nuevo'').

El código:

#define _CRTDBG_MAP_ALLOC #include <crtdbg.h> #include <stdlib.h> int main(int argc, char *argv[]) { int *var = new int(5); _CrtDumpMemoryLeaks(); return 0; }

La salida es la siguiente:

Detected memory leaks! Dumping objects -> {58} normal block at 0x007D1510, 4 bytes long. Data: < > 05 00 00 00 Object dump complete.

Si _CrtDumpMemoryLeaks() no puede generar números de línea cuando asigna el uso de ''nuevo'', se agradecen las sugerencias para otras formas de lograr un comportamiento similar.


Cuando define _DEBUG e incluye <crtdbg.h> obtiene un operator new sobrecargado operator new que toma parámetros adicionales que puede usar para especificar el archivo y los números de línea en las new expresiones de ubicación.

P.ej

int* p = new (_NORMAL_BLOCK, __FILE__, __LINE__) int(5);

Puede envolver esto en una macro condicionalmente definida, por ejemplo,

#ifdef _DEBUG #define DEBUG_NEW_PLACEMENT (_NORMAL_BLOCK, __FILE__, __LINE__) #else #define DEBUG_NEW_PLACEMENT #endif int* p = new DEBUG_NEW_PLACEMENT int(5);

Si bien hay personas que definen una macro new para ocultar por completo este código de cliente de formulario, no lo recomiendo personalmente, ya que rompe cualquier cosa que intencionalmente use la ubicación nueva y debe asegurarse de que cualquier encabezado use la ubicación nueva ) se incluyen antes de cualquier encabezado redefiniendo new . Esto puede facilitar que algunos usos en línea de los new archivos de cabecera se deslicen sin ser "ajustados".



Es posible que necesites estas definiciones después de tu incluye

#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif



La respuesta aceptada por Charles Bailey requiere que cambie su código fuente y esto no es necesario. Si está utilizando new y delete (o las versiones de matriz), todo lo que debe hacer es colocar este fragmento de código en el archivo stdafx.h de cada uno de sus proyectos (incluidas las dependencias de la biblioteca estática o dinámica), y luego le dará un archivo de origen y un número de línea adjunto a cada objeto de memoria filtrado:

#ifdef _DEBUG #ifndef DBG_NEW #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ ) #define new DBG_NEW #endif #endif // _DEBUG

Esto viene directamente de la webpage de Microsoft al respecto.