CRT не печатает номер строки утечки памяти
У меня есть код ниже, который, я думаю, основанный на Нахождении Утечек памяти Используя Библиотеку CRT, должен напечатать номер строки утечки памяти.
#include "stdafx.h"
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <iostream>
void derp()
{
int* q = new int;
}
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
derp();
return 0;
}
Когда я запускаю его, я получаю следующее:
Detected memory leaks!
Dumping objects ->
{75} normal block at 0x0067E930, 4 bytes long.
Data: < > CD CD CD CD
Object dump complete.
Основываясь на документации Microsoft, я ожидаю увидеть распечатку строки, в которой была выделена утечка памяти, но я этого не делаю.
Что я сделал не так? Я использую VS2015.
3 ответа
Из темы MSDN:
Эти методы работают для памяти, выделенной с использованием стандартной функции CRT malloc. Однако, если ваша программа выделяет память с помощью оператора C++ new, вы можете увидеть только номер файла и строки, где реализация глобального оператора new вызывает _malloc_dbg, в отчете об утечке памяти. Поскольку это поведение не очень полезно, вы можете изменить его, чтобы сообщить строку, которая произвела выделение, используя макрос, который выглядит следующим образом:
#ifdef _DEBUG
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
// Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the
// allocations to be of _CLIENT_BLOCK type
#else
#define DBG_NEW new
#endif
А затем заменить new
в вашем коде с DBG_NEW
, Я проверил это, и он работает правильно с вашим кодом.
На самом деле, заменяя new
с DBG_NEW
везде в коде это слишком утомительная задача, поэтому, возможно, вы могли бы использовать этот макрос:
#ifdef _DEBUG
#define new new( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#else
#define new new
#endif
Я проверил этот метод, и он тоже работает.
Проверьте ответ здесь. Вы хотите использовать перегруженный new
Оператор с дополнительными параметрами, указанными в решении, чтобы получить эту информацию.
В этом случае измените свою линию
int* q = new int;
в
int* q = new (_NORMAL_BLOCK, __FILE__, __LINE__) int;
и вы должны увидеть утечки.
На это нужно было уже где-то ответить.
"Эти методы работают с памятью, выделенной с помощью стандартной функции malloc CRT. Однако, если ваша программа выделяет память с помощью оператора C++ new, вам нужно переопределить new, если вы хотите видеть номера файлов и строк в отчете об утечке памяти".
В результате вы получите строку вашего нового определения оператора. Вы можете использовать трюк, что new может принимать дополнительные параметры, и некоторые из них могут быть установлены по умолчанию в значение макроопределений, таких как __LINE__
а также __FILE__