Я хочу проверить мою программу на утечки памяти и нашел эта статья 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 для перехода на линию не работает.
Не могли бы вы мне помочь?
Вы #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, который вы хотите проверить.
Похоже, что в образце документации VS2013 вверху есть опечатка. Так должно быть:
#define _CRTDBG_MAP_ALLOC
Обратите внимание на подчеркивание. Использование документа VS2005 / 2008 _CRTDBG_MAP_ALLOC
и ссылки на документ VS2013 _CRTDBG_MAP_ALLOC
позже.
Несколько других вещей, которые вы можете проверить:
_CRTDBG_MAP_ALLOC
определение к stdafx.h
Надеюсь, это поможет, если вы не разобрались с @ 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;
}