_CRTDBG_MAP_ALLOC не показывает имя файла

18

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

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

(Благодаря Тушару Джадхаву: увеличивается потребление памяти быстро, потом очень медленно падает; утечка памяти? )

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

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.

Так, как я могу сделать так, чтобы это показывало имя файла и местоположение утечки?

    
задан Nick X Tsui 20.11.2013 в 22:47
источник
  • Код, который выделяет только что не был скомпилирован с вашими #defines. Может быть размещен в библиотеке, может быть в DLL, как в предварительно созданных специализациях классов шаблонов C ++. Или DLL, которая содержит код, была выгружена до того, как был создан отчет об утечке. –  Hans Passant 20.11.2013 в 23:18
  • @HansPassant Итак, вы говорите, что это не был мой «подозрительный код», который протекает; это был код / ​​bianraies / dlls, вызываемый внутри «подозрительного кода»? –  Nick X Tsui 21.11.2013 в 20:24
  • Я бы сказал, что это код, который вы не нашли, может быть где угодно. Обычная проблема с утечками, не так ли? Если вы можете получить число между {фигурными скобками} для повторения, тогда установите _crtBreakAlloc на это число. –  Hans Passant 21.11.2013 в 23:40

2 ответа

7

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

    
ответ дан Nick X Tsui 03.12.2013 в 21:30
  • Есть ли быстрый способ включения CRT во всех файлах без, например, создавая новый заголовок с определениями в нем и включая его везде? –  aquirdturtle 07.01.2016 в 22:10
  • Вторичный вопрос aquirdturtle: похоже, что весь код в моем программном обеспечении начинается, включая «stdafx.h», поэтому я добавил эти три строки после комментария «TODO» и перестроен. Этого было недостаточно. // TODO: ссылки на дополнительные заголовки, требуемые вашей программой здесь #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> –  Swiss Frank 09.02.2016 в 04:48
11

В моем случае я добавил материал из этого поток в мой код. Это переопределяет оператор 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.
    
ответ дан Krøllebølle 02.10.2015 в 13:30