2013-11-20 1 views
18

Я пытаюсь обнаружить утечку памяти, и я использую макрос _CRTDBG_MAP_ALLOC для определения места утечки. Так я определяю MACRO как следующее:_CRTDBG_MAP_ALLOC, не отображающее имя файла

#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 

В моем коде, у меня есть:

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; 
} 

(Благодаря Tushar Jadhav: Memory consumption increases quickly, then drops very slowly; memory leak?)

Но выход показывает что-то вроде:

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 

вместо примерно такого:

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. 

Как я могу показать это имя файла и местонахождение утечки?

+0

код, который выделяет только не был скомпилирован с #defines в результате. Может быть размещен в библиотеке, может быть в DLL, как в предварительно созданных специализациях классов шаблонов C++. Или DLL, которая содержит код, была выгружена до того, как был создан отчет об утечке. –

+0

@ HansPassant Итак, вы говорите, что это не мой «подозрительный код», который просачивается; это был код/​​bianraies/dlls, вызываемый внутри «подозрительного кода»? –

+0

Я бы сказал, что это код, которого вы не нашли, может быть где угодно. Обычная проблема с утечками, не так ли? Если вы можете получить число между {фигурными скобками} для повторения, тогда установите _crtBreakAlloc на это число. –

ответ

7

Кажется, строка утечки отображается только в том случае, если CRT включен в этом файле cpp.

+4

Есть ли быстрый способ включения CRT во всех файлах без, например. создавая новый заголовок с определениями в нем и включая его везде? – aquirdturtle

+0

Вопрос Seconding aquirdturtle: похоже, что весь код в моем программном обеспечении начинается, включая «stdafx.h», поэтому я добавил эти три строки после комментария «TODO» и перестроил. Этого было недостаточно. '// TODO: ссылка дополнительные заголовки программа требует here' ' #define _CRTDBG_MAP_ALLOC' '#include ' ' #include ' –

8

В моем случае я в конечном итоге включил материал из this в мой код. Это переопределяет оператор new и включает имя файла и номер строки в нем для последующей печати. Не уверен, что это применимо только к Visual Studio.

#define _CRTDBG_MAP_ALLOC 
#include <crtdbg.h> 
#ifdef _DEBUG 
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#define new DEBUG_NEW 
#endif 

Весь тестовый код из ссылочного источника:

#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; 
} 

, который в моих тестовых примеров отпечатков:

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.