Обнаружение утечки памяти в Visual Studio не печатает имя файла и номер строки

Я хочу проверить мою программу на утечки памяти и нашел эта статья Microsoft.

Я внимательно следил за статьей и добавил

#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 для перехода на линию не работает.

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

8

Решение

Вы #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 определены (источник).
Также из этого ответ убедитесь, что #define находится в файле cpp, который вы хотите проверить.

1

Другие решения

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

#define _CRTDBG_MAP_ALLOC

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

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

  • Убедитесь, что вы находитесь в сборке Debug
  • Очистить / перестроить ваше приложение
  • Если вы используете предварительно скомпилированный заголовок, убедитесь, что вы добавили _CRTDBG_MAP_ALLOC определение к stdafx.h
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;
}
0