C++ - Тестирование утечки памяти с помощью _CrtDumpMemoryLeaks() - Не выводит номера строк
Я работаю над игрой с 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;
}
Вывод следующий:
Detected memory leaks!
Dumping objects ->
{58} normal block at 0x007D1510, 4 bytes long.
Data: < > 05 00 00 00
Object dump complete.
Если _CrtDumpMemoryLeaks()
не может выводить номера строк при выделении с использованием 'new', тогда приветствуются предложения о других способах достижения аналогичного поведения.
5 ответов
Когда вы определяете _DEBUG и включаете <crtdbg.h>
вы перегружены operator new
который принимает дополнительные параметры, которые вы можете использовать, чтобы указать номер файла и строки в размещении new
выражения.
Например
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
в заголовочных файлах проскальзывать без "настройки".
Это старая версия Visual Leak Detector.
Попробуйте это: http://vld.codeplex.com/
Вам могут понадобиться эти определения после ваших включений
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
Принятый ответ Чарльза Бейли требует, чтобы вы изменили свой исходный код, и в этом нет необходимости. Если вы используете 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 по этому вопросу.
Проверьте кусок кода.
Оператор перегрузки new и оператор delete для записи всех выделений и освобождений памяти
Я обнаружил утечки памяти, используя этот метод.