2012-01-06 2 views
0

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는 것와 동일하게 나타남 모든 구성에서 수행하십시오.

+0

당신은 쉽게 디버그 및 릴리스 모드에서'delete' 호출을 통해 계단 경우 그들을 구입 어떻게 자신을 대답 할 수있다. 디버그에서, 궁극적으로'_free_dbg_nolock'에 대한 호출은 삭제 될 포인터 (그리고 힙)상의 어떤 것들을 검사합니다. release 모드에서,'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 VS STL 설치가 이러한 새/삭제 매크로 처음 위치에 있습니다. – David