2009-10-14 1 views
8

Я использую instructions found here, чтобы попытаться найти утечки памяти в приложении Win32. Как описано выше, я поставилОбнаружение утечки памяти Visual Studio 2008 (C++), не отображающее местоположение файла/метода - как заставить это работать?

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

линии в верхней части файла (файл CPP, который содержит WINAPI _tWinMain), а затем в точке выхода из WinMain я добавил

_CrtDumpMemoryLeaks(); 

К сожалению, я не см. номера линий/местоположений для утечек (но я получаю список утечек).

Я также попытался положить

_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
_CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_DEBUG); 

в начале WinMain - и опять не повезло.

Я нахожу это странным, потому что у меня обычно не было проблем с поиском утечек или их сообщением автоматически.

Это огромное, старое устаревшее приложение, над которым я работаю для нового работодателя. Раньше я работал со стандартным мастером VS.

Любые предложения о том, как получить исходные линии/методы, вызывающие утечки? (Или, по крайней мере, линии для "нового" называют

EDIT:..

I also tried visual leak detector - без успеха

Очень странно

EDIT

Я попытался с помощью переопределения новых, как указано ниже, однако я получаю ошибки при форсировании.

+0

попробуйте deleaker. это должно помочь вам. –

ответ

6

Вы уверены, что код, протекающий, использует Процедуры распределения отладки CRT? Для этого необходимо использовать malloc() или new (в отличие от LocalAlloc, GlobalAlloc, некоторые специализированные блок-распределители и т. Д.) И что _DEBUG (я думаю) должен быть определен, когда включены заголовки CRT.

Чтобы получить исходные строки для утечек, вам необходимо определить DEBUG_NEW везде, где есть распределения. Это связано с тем, что для их отслеживания каждое распределение должно быть заменено вызовом, который включает __FILE__ и __LINE__. Стандартное определение от мастера выглядит примерно так:

#ifdef _DEBUG 
#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#define new DEBUG_NEW 
#endif 

Это не обрабатывает malloc, там, наверное, подобное колдовство для этого, если код, который вы отладки использует malloc вместо new.

Если вы используете предварительно скомпилированные заголовки, вы можете просто поместить это в предварительно скомпилированный файл заголовка, и это повлияет на все исходные файлы в этом проекте.

+0

Да, не используя globalalloc. Это очень странно для меня. Я попробую добавить redef new и посмотреть, что произойдет. – Tim

+0

Я думал, что это решит мои проблемы, но при компиляции материала boost в проекте он задыхается. Думаю, мне придется каким-то образом разделить проблемы с повышением. – Tim

+6

Я тоже столкнулся с этим. Некоторые ускоряющие библиотеки переопределяют 'operator new', поэтому вам нужно выполнить определение' DEBUG_NEW' * после *, включая заголовки форсирования или, по крайней мере, некоторые из них. –