С++ - Проверка утечки памяти с помощью _CrtDumpMemoryLeaks() - не выводит номера строк
Я работаю над игрой с SDL в Visual Studio 2010. Я наткнулся на макрос _CrtDumpMemoryLeaks()
и подумал, что я отдам его. Вызов _CrtDumpMemoryLeaks()
выполняет печать утечек памяти в окне вывода, но не показывает, где это происходит.
Я прочитал статью MSDN в Включение обнаружения утечки памяти, и объясняет, что если я определяю _CRTDBG_MAP_ALLOC
, он должен вывести номер строки заявления о нарушении. Это не происходит в моем случае. (Однако я мог заставить его работать, если я использую malloc() напрямую - не используя "новое" ).
Код:
#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()
не может выводить номера строк при распределении с использованием "нового", тогда предлагаются предложения по другим способам достижения аналогичного поведения.
Ответы
Ответ 1
Когда вы определяете _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 ( такие как многие стандартные заголовки) включены перед тем, как переопределить заголовок new
. Это упростит возможность прокрутки некоторых встроенных приложений new
в файлах заголовков без "корректировки".
Ответ 2
Это старая версия Visual Leak Detector.
Попробуйте следующее: http://vld.codeplex.com/
Ответ 3
Вам могут потребоваться эти определения после того, как вы включите
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
Ответ 4
Проверьте фрагмент кода.
Перегрузка оператора new и оператор delete для регистрации всех распределений и освобождений памяти
Я идентифицировал утечки памяти, используя этот метод.
Ответ 5
Принятый ответ Чарльза Бейли требует, чтобы вы изменили исходный код, и это не обязательно. Если вы используете 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 веб-страницы по этому вопросу.