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
が希望と同じに見えますどのような構成でも実行できます。
あなたは簡単にデバッグとリリースモードで 'DELETE'呼び出しを通じて段階ならば、それはそれらを買う何を自分で答えることができます。デバッグでは、最終的に '_free_dbg_nolock'の呼び出しが行われ、削除されるポインタ(およびヒープ)上の特定のものをチェックします。リリースモードでは、 'operator delete'は単に' free'を呼び出します。私は正確に彼らが何をチェックし、なぜ彼らがそれをするのか分からないが、それは今私たちのビジネスではない?私はそのデバッグヒープが好きです。 – Xeo
@ Xeoしかし、デバッグヒープの利点は、 '_DebugHeapDelete'または' delete'のどちらを使っても得られます。 '_DebugHeapDelete'は' operator delete'をバイパスし、代わりに 'free'を直接呼び出す以外は、ちょうど' delete'です。つまり、ユーザの 'operator delete'をバイパスします(ユーザの' operator new'が割り当てられていても、私のバグのようです)。 *その点は何ですか? – David