Как отключить «поддержку кучи отладки» в реализации STL VS2010?Я написал трекер памяти, который перегружает новые и удаляет и добавляет узел отслеживания перед выделениями.К сожалению, некоторые объекты STL используют мой оператор new, а затем пытаются удалить с помощью приведенного ниже макроса вместо моего оператора 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
сделает в любой конфигурации.