Макрос VS2010 _DELETE_CRT в STL - PullRequest
       7

Макрос VS2010 _DELETE_CRT в STL

0 голосов
/ 07 января 2012

Как отключить «поддержку кучи отладки» в реализации 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 сделает в любой конфигурации.

1 Ответ

0 голосов
/ 07 января 2012

Установите _NO_DEBUG_HEAP=1 в вашей среде.

(Кстати, это переменная среды, а не #define)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...