如何在VS2010的STL实现中关闭“对调试堆的支持”?我写了一个内存跟踪器,它重载new并删除并在分配前添加一个跟踪节点。遗憾的是,一些STL对象使用我的operator new,然后尝试使用下面的宏而不是我的operator delete删除。这意味着他们尝试free
malloc
未归还的地址。由于下面的宏,我的代码在调试中崩溃但在发布中没有崩溃(哈哈)。
来自<xdebug>
:
// SUPPORT FOR DEBUG HEAP
#if defined(_DEBUG)
#define _DELETE_CRT(ptr) _STD _DebugHeapDelete(ptr)
template<class _Ty>
void __CLRCALL_OR_CDECL _DebugHeapDelete(_Ty *_Ptr)
{ // delete from the debug CRT heap even if operator delete exists
if (_Ptr != 0)
{ // worth deleting
_Ptr->~_Ty();
// delete as _NORMAL_BLOCK, not _CRT_BLOCK, since we might have
// facets allocated by normal new.
free(_Ptr);
}
}
#else /* defined(_DEBUG) */
#define _DELETE_CRT(ptr) delete (ptr)
作为参考,确切的崩溃发生在locale operator=
:
locale& operator=(const locale& _Right) _THROW0()
{ // assign a locale
if (_Ptr != _Right._Ptr)
{ // different implementation, point at new one
_DELETE_CRT(_Ptr->_Decref());
_Ptr = _Right._Ptr;
_Ptr->_Incref();
}
return (*this);
}
我甚至没有看到_DebugHeapDelete
正在购买它们 - 它看起来与operator delete
在任何配置中所做的相同。
答案 0 :(得分:0)
在您的环境中设置_NO_DEBUG_HEAP=1
。
(顺便说一下,这是一个环境变量,而不是#define
)