STL中的VS2010 _DELETE_CRT宏

时间:2012-01-06 21:52:15

标签: c++ visual-studio-2010

如何在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在任何配置中所做的相同。

1 个答案:

答案 0 :(得分:0)

在您的环境中设置_NO_DEBUG_HEAP=1

(顺便说一下,这是一个环境变量,而不是#define