VS2010의 STL 구현에서 "디버그 힙 지원"을 해제하려면 어떻게합니까? 나는 새로운 것을 과부하시키고 삭제 앞의 할당 추적 노드를 추가하는 메모리 트래커를 작성했다. 슬프게도 일부 STL 개체는 내 연산자 new를 사용하고 내 연산자 삭제 대신 아래 매크로를 사용하여 삭제하려고합니다. 이는 malloc
에 의해 반환되지 않은 주소 인 free
을 시도한다는 의미입니다. 아래 매크로 때문에 디버그에서는 코드가 충돌하지만 릴리스에서는 그렇지 않습니다. <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=
에 : 나는 심지어 _DebugHeapDelete
그들을 구입하고 무엇을 볼 수 없습니다
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);
}
- 그것은 무엇 operator delete
는 것와 동일하게 나타남 모든 구성에서 수행하십시오.
당신은 쉽게 디버그 및 릴리스 모드에서'delete' 호출을 통해 계단 경우 그들을 구입 어떻게 자신을 대답 할 수있다. 디버그에서, 궁극적으로'_free_dbg_nolock'에 대한 호출은 삭제 될 포인터 (그리고 힙)상의 어떤 것들을 검사합니다. release 모드에서,'operator delete'는'free'를 호출 할 것입니다. 정확히 그들이 무엇을 확인하고 왜 그것을하는지는 모르겠지만 그것은 지금 우리 사업이 아닙니다. 그렇습니까? 나는 디버그 힙을 좋아한다. – Xeo
@Xeo 그러나 여러분은'_DebugHeapDelete' 또는'delete'를 사용하던간에 디버그 힙의 이점을 얻습니다. '_DebugHeapDelete'는'operator delete'를 우회하고'free'를 직접 호출하는 것을 제외하고는 정확히'delete'입니다. 이는 사용자의'operator delete'를 우회 함을 의미합니다 (사용자의'operator new '로 할당 된 경우에도 버그라고 생각합니다). * 그 점은 무엇입니까? – David