c++ - por - _CRTDBG_MAP_ALLOC no muestra el nombre del archivo
leer archivo txt c++ linea por linea (2)
Estoy intentando detectar una pérdida de memoria y estoy usando la macro make _CRTDBG_MAP_ALLOC para ubicar el área de las fugas. Así que estoy definiendo MACRO como sigue:
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif
En mi código, tengo:
UINT SomeFunThread( LPVOID pParam )
{
_CrtMemState crtMemStateStart;
_CrtMemState crtMemStateFinish;
_CrtMemCheckpoint(&crtMemStateStart);
// My suspisious code
_CrtMemCheckpoint(&crtMemStateFinish);
int nDifference(0);
_CrtMemState crtMemStateDifference;
nDifference = _CrtMemDifference(&crtMemStateDifference, &crtMemStateStart, &crtMemStateFinish);
if(nDifference > 0)
_CrtDumpMemoryLeaks();
return 0;
}
(Gracias a Tushar Jadhav: el consumo de memoria aumenta rápidamente y luego disminuye muy lentamente; ¿pérdida de memoria? )
Pero la salida muestra algo como:
Detected memory leaks!
Dumping objects ->
{124058} normal block at 0x0000000031DED080, 24 bytes long.
Data: < 0 ` $ > C8 30 F7 EF FE 07 00 00 60 D2 24 1D 00 00 00 00
en lugar de algo como esto:
Detected memory leaks!
Dumping objects ->
C:/PROGRAM FILES/VISUAL STUDIO/MyProjects/leaktest/leaktest.cpp(20) : {18}
normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Entonces, ¿cómo puedo hacer que esto muestre el nombre del archivo y la ubicación de la fuga?
En mi caso, terminé incluyendo las cosas de this hilo en mi código. Esto anula al new
operador e incluye el nombre del archivo y el número de línea en él para su posterior impresión. No estoy seguro si esto es aplicable a Visual Studio solamente.
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif
El código de prueba completo de la fuente referenciada es:
#define _CRTDBG_MAP_ALLOC
#include<iostream>
#include <crtdbg.h>
#ifdef _DEBUG
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif
int main()
{
char *a = new char[10];
_CrtDumpMemoryLeaks();
return 0;
}
que en mi caso de prueba imprime:
Detected memory leaks!
Dumping objects ->
e:/test/testapplication/testapplication.cpp(11) : {144} normal block at 0x007F4EF0, 10 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Parece que la línea de la fuga solo se muestra si el CRT está activado en ese archivo cpp.