Попытка отладить утечки памяти с помощью отладчика кучи Visual Studio 2008

Мы пытаемся отследить утечки памяти в нашем приложении Visual Studio C++. Приложение неуправляемое. Я пытался использовать VS Heap Debugger, чтобы отобразить расположение файлов утечки памяти.

Я пытался использовать методы, описанные здесь (см.: "Каково влияние использования _CRTDBG_MAP_ALLOC на операторы" new "и" delete "C++?"):

http://forums.codeguru.com/showthread.php?312742-Visual-C-Debugging-How-to-manage-memory-leaks

и вот (см.: "Как заставить это работать, том 2"):

http://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=VS.80%29.aspx

Я определил следующий макрос:

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

Проблема в том, что мы используем код Microsoft xtree VS, который включает в себя следующее:

_Nodeptr _Buynode(_Nodeptr _Larg, _Nodeptr _Parg,
                  _Nodeptr _Rarg, const value_type& _Val, char _Carg)
{   // allocate a node with pointers, value, and color
    _Nodeptr _Wherenode = this->_Alnod.allocate(1);
    _TRY_BEGIN
        new (_Wherenode) _Node(_Larg, _Parg, _Rarg, _Val, _Carg);
    _CATCH_ALL
    this->_Alnod.deallocate(_Wherenode, 1);
    _RERAISE;
    _CATCH_END
    return (_Wherenode);
}

Новый оператор выделяет память в определенном месте _Wherenode, и макрос завершается ошибкой:

error C2061: syntax error : identifier '_Wherenode'

Я перепробовал несколько макроопределений, но они тоже не работают.

Кто-нибудь может помочь?

1 ответ

Решение

Макро версия new мешает вам использовать размещение новых. Препроцессор расширяет выражение до следующего

new(_NORMAL_BLOCK, __FILE__, __LINE__)(_Wherenode)

Чтобы обойти это, вам нужно отменить определение макроса, прежде чем включать любой заголовочный файл, который использует новое размещение.

#undef new
#include <xtree>
#define new DEBUG_NEW
#include <map>

Или немного более безопасный способ

#pragma push_macro("new")
#undef new
#include <xtree>
#pragma pop_macro("new")
#include <map>
Другие вопросы по тегам