C ++ - Тестирование утечки памяти с помощью _CrtDumpMemoryLeaks () - Не выводит номера строк - PullRequest
16 голосов
/ 08 июля 2010

Я работаю над игрой с SDL в Visual Studio 2010. Я наткнулся на макрос _CrtDumpMemoryLeaks() и решил попробовать. Вызов _CrtDumpMemoryLeaks() приводит к утечке памяти в окно вывода, но не показывает, где это происходит.

Я прочитал статью MSDN по адресу Включение обнаружения утечки памяти , и он объясняет, что если я определю _CRTDBG_MAP_ALLOC, он должен вывести номер строки оператора, вызывающего ошибку. Это не происходит в моем случае. (Однако я смог заставить его работать, если я использую malloc () напрямую - не используя 'new').

код:

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

int main(int argc, char *argv[]) {
    int *var = new int(5);

    _CrtDumpMemoryLeaks();

    return 0;
}

Вывод следующий: <pre> Detected memory leaks! Dumping objects -> {58} normal block at 0x007D1510, 4 bytes long. Data: < > 05 00 00 00 Object dump complete.

Если _CrtDumpMemoryLeaks() не может вывести номера строк при распределении с использованием 'new', тогда приветствуются предложения о других способах достижения аналогичного поведения.

Ответы [ 5 ]

9 голосов
/ 08 июля 2010

Когда вы определяете _DEBUG и включаете <crtdbg.h>, вы получаете перегруженный operator new, который принимает дополнительные параметры, которые можно использовать для указания номеров файлов и строк в выражениях new.

* 1006 Е.Г. *

int* p = new (_NORMAL_BLOCK, __FILE__, __LINE__) int(5);

Вы можете заключить это в условно определенный макрос, например,

#ifdef _DEBUG
#define DEBUG_NEW_PLACEMENT (_NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_NEW_PLACEMENT
#endif

int* p = new DEBUG_NEW_PLACEMENT int(5);

В то время как вы видите людей, определяющих макрос new, чтобы полностью скрыть этот клиентский код формы, я лично не рекомендую его, поскольку он ломает все, что уже сделано намеренно, с использованием размещения new, и вы должны убедиться, что любые заголовки, использующие размещение new ( например, многие стандартные заголовки) перед любым переопределением заголовка new. Это позволяет легко использовать некоторые встроенные варианты использования new в заголовочных файлах без «корректировки».

8 голосов
/ 08 июля 2010

Это старая версия Visual Leak Detector.

Попробуйте это: http://vld.codeplex.com/

3 голосов
/ 08 июля 2010

Возможно, вам понадобятся эти определения после того, как вы включите


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
2 голосов
/ 02 января 2016

Принятый ответ Чарльза Бейли требует, чтобы вы изменили свой исходный код, и в этом нет необходимости.Если вы используете new и delete (или версии массива), все, что вам нужно сделать, это поместить этот фрагмент кода в файл stdafx.h каждого из ваших проектов (включая любые зависимости статической или динамической библиотеки), изатем он предоставит исходный файл и номер строки, прикрепленные к каждому объекту утечки памяти:

#ifdef _DEBUG
   #ifndef DBG_NEW
      #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
      #define new DBG_NEW
   #endif
#endif  // _DEBUG

Это прямо из веб-страницы Microsoft по этому вопросу.

2 голосов
/ 08 июля 2010

Проверьте кусок кода.

Оператор перегрузки new и оператор delete для регистрации всех выделений и освобождений памяти

Я обнаружил утечки памяти, используя этот метод.

...