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__

Другие вопросы по тегам