2012-01-06 8 views
0

VS2010のSTL実装で「デバッグヒープのサポート」をオフにするにはどうすればよいですか?私は新しいトラッカーをオーバーロードし、トラッキングノードを割り振りの前に追加して追加するメモリートラッカーを作成しました。残念ながら、いくつかのSTLオブジェクトは、私の演算子newを使用して、私の演算子deleteではなく、以下のマクロで削除しようとします。つまり、彼らはmallocによって返されなかったアドレスfreeにしようとします。以下のマクロのために、私のコードはデバッグではクラッシュしますが、リリース(hah)ではクラッシュしません。 <xdebug>からSTLのVS2010 _DELETE_CRTマクロ

// 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

あなたは簡単にデバッグとリリースモードで 'DELETE'呼び出しを通じて段階ならば、それはそれらを買う何を自分で答えることができます。デバッグでは、最終的に '_free_dbg_nolock'の呼び出しが行われ、削除されるポインタ(およびヒープ)上の特定のものをチェックします。リリースモードでは、 'operator delete'は単に' free'を呼び出します。私は正確に彼らが何をチェックし、なぜ彼らがそれをするのか分からないが、それは今私たちのビジネスではない?私はそのデバッグヒープが好きです。 – Xeo

+0

@ Xeoしかし、デバッグヒープの利点は、 '_DebugHeapDelete'または' delete'のどちらを使っても得られます。 '_DebugHeapDelete'は' operator delete'をバイパスし、代わりに 'free'を直接呼び出す以外は、ちょうど' delete'です。つまり、ユーザの 'operator delete'をバイパスします(ユーザの' operator new'が割り当てられていても、私のバグのようです)。 *その点は何ですか? – David

答えて

0

ご使用の環境に_NO_DEBUG_HEAP=1を設定してください。

(それは仕方によって、環境変数ではなく、#defineです)

+0

これはデバッグヒープを無効にしますが、STLがデバッグで 'operator delete'ではなく' _DebugHeapDelete'を呼び出すことを止めません。私の問題は、デバッグヒープを無効にするだけで少し違っています。しかし、なぜVSがこれらの新しい/削除マクロを持つSTLセットアップを最初に持っているのかわかりません。 – David