8

Я хочу проверить свою программу на утечку памяти и найти this Microsoft article.Обнаружение утечки памяти Visual Studio не печатает имя файла и номер строки

я тщательно следил за статью и добавил

#define CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

и

_CrtDumpMemoryLeaks(); 

при выходе из программы.

Это правильно сбрасывает все данные утечки памяти в моем окне вывода, но вот проблема:

Он не печатает имя файла и номер строки, где утечка памяти!

В статье говорится, что с #define _CRTDBG_MAP_ALLOC он печатает имя файла и номер строки, но это не для меня.

Мой результат выглядит следующим образом

Detected memory leaks! 
Dumping objects -> 
{3456} normal block at 0x038F81E8, 560 bytes long. 
Data: <  A  B> 00 00 00 00 00 00 10 41 00 00 00 FF 00 00 E6 42 
{3447} normal block at 0x038F8170, 56 bytes long. 
Data: < B ^B  > 80 42 90 03 10 02 5E 08 80 42 90 03 00 00 CD CD 
{3440} normal block at 0x038F86B0, 840 bytes long. 
Data: <  A  B> 00 00 00 00 00 00 10 41 00 00 00 FF 00 00 A8 42 
... 

Так я не могу работать с этим ... и нажав клавишу F4 для перехода к линии не работает.

Не могли бы Вы помочь мне?

+0

Если у вас есть отладки сборки, попробуйте запустить приложение под [Application Verifier] (https://www.microsoft.com/en-us/download/details.aspx?id=20028) – rrirower

ответ

0

Похоже, есть опечатка в образце документа VS2013 в верхней части. Это должно быть:

#define _CRTDBG_MAP_ALLOC 

Обратите внимание на ведущее подчеркивание. В документе VS2005/2008 используются _CRTDBG_MAP_ALLOC и ссылки на документы VS2013 _CRTDBG_MAP_ALLOC.

Несколько других вещей, которые вы можете проверить:

  • Убедитесь, что вы находитесь в отладочном
  • Clean/пересобрать приложение
  • Если вы используете предкомпилированный заголовок убедитесь, что вы добавить _CRTDBG_MAP_ALLOC определение по stdafx.h
+2

Я тоже пробовал, но он все равно не покажет имя файла и номер строки –

1

Вы ошиблись #define. Для того, чтобы получить формат

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. 

Вы должны использовать:

#define _DEBUG 
#define _CRTDBG_MAP_ALLOC 

Вы должны включить _DEBUG, а так _CRTDBG_MAP_ALLOC доступен только с _DEBUG определенной (source). Также из этого answer убедитесь, что #define находится в файле cpp, который вы хотите проверить.

0

Надеюсь, это поможет, если у вас возникло желание @ A.D, работает для приложений win32, нам нужно переопределить новый оператор. к сожалению, он не работает для приложения MFC.:(

#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() 
{ 
_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF) ; 
char *a = new char[10]; 
return 0; 
}