2

我们正在尝试追踪 Visual Studio C++ 应用程序中的内存泄漏。应用程序不受管理。我一直在尝试使用 VS Heap Debugger 来显示泄漏内存的文件位置。

我一直在尝试使用此处解释的技术(请参阅:“在 C++ 'new' 和 'delete' 运算符上使用 '_CRTDBG_MAP_ALLOC' 的效果是什么?”):

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'

我尝试了多个可变参数宏定义,但这些也失败了。

任何人都可以帮忙吗?

4

1 回答 1

3

宏版本会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>
于 2013-05-23T10:37:09.547 回答