2017-01-10 2 views
2

Я пытаюсь отлаживать очень старый, большой проект на C++. Это дает следующее сообщение об ошибке:Обнаруженный утечка памяти

Detected memory leaks! 
Dumping objects -> 
{629} normal block at 0x0000000000084CA0, 16 bytes long. 
Data: < ?   > D0 A7 F0 3F 01 00 00 00 00 00 00 00 00 00 00 00 
{628} normal block at 0x0000000000084C20, 16 bytes long. 
Data: < ?   > 10 A9 F0 3F 01 00 00 00 00 00 00 00 00 00 00 00 
{5667963} normal block at 0x000000000709FB20, 88 bytes long. 
.... 
.... 
Data: <p  3  > 70 D0 0F 07 00 00 00 00 33 00 00 00 00 01 00 00 
Object dump complete. 
The program '[4892] Classifier.exe' has exited with code 0 (0x0). 

Я не могу вставить программу, так как его довольно большой, но он идет, как это

void main(int argc, char *argv[]) 
{ 
    try 
    { 

    _CrtDumpMemoryLeaks(); //memory leak detection 
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG); 
    .... 
    .... 
    } 
    catch() 
    { .... 
    } 
} 

В режиме отладки программа работает успешно. Однако на выходе я вижу вышеупомянутое сообщение об ошибке. Нет, где на выходе я могу найти номер строки, который даст мне информацию о том, где обнаружена утечка памяти.

Есть ли что-нибудь дополнительное, что мне нужно добавить для просмотра номера строки?

Спасибо

+1

Это не ошибка сообщение. –

+0

Когда он обнаруживает утечку памяти - вам нужно выяснить, где была создана память. –

ответ

5

Добавьте эту строку после _CrtSetDbgFlag

_CrtSetBreakAlloc(629); 

629 является то, что вы видите в журнале дампа, обычно это означает, что 629 выделение памяти. Запустите debug снова, вы остановитесь при этом распределении, тогда вы можете проверить стек вызовов, чтобы узнать, что это.

+1

Это будет делать только трюк, если код выполняет ту же последовательность распределения при последующих прогонах. Поэтому обязательно выполняйте программу таким же образом каждый раз, чтобы попытаться гарантировать последовательность. –

+0

И если у вас есть более 1 нить, «оставите всю надежду». Тем не менее, это лучший ответ, прежде чем делать полный контроль кода. –

+0

Это не невозможно, но нужно больше усилий и терпения. Просто вопрос стоит или нет. –

0

Согласно microsoft documentation, чтобы получить лучший отчет, который показывает имя файла и номер строки, где утечка памяти первого выделенного, вы должны сначала включить _CRTDBG_MAP_ALLOC

#define _CRTDBG_MAP_ALLOC 
#include <cstdlib> 
#include <crtdbg.h> 

И если программа использует new, и не malloc, для распределения, необходимо определить этот макрос:

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

что в вашем случае, отладка старой программы, если у него есть достаточное количество файлов, не очень полезно. Но есть трюк, который можно сделать,

#define new new (_NORMAL_BLOCK , __FILE__ , __LINE__) 

Но этот трюк имеет некоторые недостатки. Если класс переопределяет new, например, или если программа использует placement new.

Вы также можете переопределить оператора new и delete. Вот отличная статья о том, как это может быть сделано для обнаружения утечек в старой программе: link

EDIT: Кто-то здесь дает еще один способ использования макросов DBG_NEW отладить существующую программу, link