2011-05-06 3 views
1

내 코드에서 mem leak를 제어하려고합니다. 이 코드를 추가하는 경우"new"를 덮어 쓸 때 컴파일 오류가 발생합니다.

// You may need to locate mem leaks 
    #define ZEL_CHECK_MEMORY_LEAKS 
    #ifdef ZEL_CHECK_MEMORY_LEAKS 
     #define _CRTDBG_MAP_ALLOC 
     #include <cstdlib> 
     #include <crtdbg.h> 

     #ifdef _DEBUG 
     #ifndef DBG_NEW 
     #define DBG_NEW new (_NORMAL_BLOCK , __FILE__ , __LINE__) 
     #define new DBG_NEW 
     #endif 
     #endif // _DEBUG 

     #define zelInitMemoryCheck() \ 
      _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF) 
    #else 
     #define zelInitMemoryCheck() 
    #endif //ZEL_CHECK_MEMORY_LEAKS 

, 나는이 컴파일 오류 얻을 : 내 일반 헤더 파일에이 코드 추가 한 또한

1>c:\archivos de programa\microsoft visual studio 9.0\vc\include\xlocmon(283) : error C2061: syntax error : identifier '_DebugHeapTag_func' 
1>  c:\archivos de programa\microsoft visual studio 9.0\vc\include\xlocmon(281) : while compiling class template member function 'size_t std::moneypunct<_Elem,_Intl>::_Getcat(const std::locale::facet **,const std::locale *)' 
1>  with 
1>  [ 
1>   _Elem=char, 
1>   _Intl=true 
1>  ] 
1>  c:\archivos de programa\microsoft visual studio 9.0\vc\include\xlocmon(908) : see reference to class template instantiation 'std::moneypunct<_Elem,_Intl>' being compiled 
1>  with 
1>  [ 
1>   _Elem=char, 
1>   _Intl=true 
1>  ] 

을 내 소스 코드에서 나는이 포함이 : MEM은 제어 코드를 유출

#include "core/zelCoreLib.h" 
#include <boost/shared_ptr.hpp> 

이는 VC9.0이없는 사람으로 zelCoreLib.h

에있다

static size_t __CLRCALL_OR_CDECL _Getcat(const locale::facet **_Ppf = 0, 
     const locale *_Ploc = 0) 
     { // return locale category mask and construct standard facet 
     if (_Ppf != 0 && *_Ppf == 0) 
      *_Ppf = _NEW_CRT moneypunct<_Elem, _Intl>(
       _Locinfo(_Ploc->name()), 0, true); 
     return (_X_MONETARY); 
     } 

문자열과 로케일 기능의 일부인 것처럼 보입니다. 또한, 추가 정보로, 나는 루아와 LuaBind libs와

어떤 도움 당신은 #define new

+1

[vld] (http://sites.google.com/site/dmoulding/vld)와 같은 기존 도구를 사용하지 않는 이유는 무엇입니까? –

+0

계속하려면 여기에 절대적으로 충분하지 않습니다. _complete_, 최소한의 테스트 케이스를 만드십시오. –

+0

몇 가지 최소한의 예를 들었고 모두 괜찮 았습니다. 그리고이 시점에서 나는이 오류가 있습니다. 내 로그 라이브러리를 모두 삽입 할 수는 있지만 과도 할 수도 있습니다. – Killrazor

답변

3

환영합니다 사용합니다. new은 키워드이고 #define 인 경우 표준 라이브러리에 헤더를 포함하면 정의되지 않은 동작이 발생합니다. 표준 라이브러리는 예를 들어 일부 장소에서 새로운 배치를 거의 확실히 사용하므로 매크로를 사용하면 새로운 배치를 사용하여 중단시킬 수 있습니다. 또한 new 특정 클래스가 —을 깨뜨릴 수 있으며 라이브러리에서이 클래스도 사용할 수 있습니다. 키워드를 다시 정의하고 작동 할 것으로 예상 할 수 없습니다.

+0

예, _GETcat 코드에서 _NEW_CRT 매크로를 볼 때 뭔가 의심 스러웠습니다. 이 문제에 대한 간단한 해결책이 있습니까? 감사합니다 – Killrazor

+1

그것은 당신의 정의에 따라 달라집니다 :-). 리눅스에서 valgrind를 사용하면 코드가 그것을 받아 들일 수 있습니다. (코드는 valgrind에서 느린 속도로 실행됩니다. 예를 들어 소켓을 충분히 처리 할 수없는 경우에는 실행이 불가능할 수도 있습니다.) 그렇지 않으면 스택을 수동으로 뒤로 이동하여 반환 값을 저장하는 코드를 작성했습니다 주소 (나중에 16 진수로 출력 할 수 있음). 그러나 분명히 이식 할 수는 없으며 일반적으로 말하면 간단하지는 않습니다. –

+2

@Killrazor - Microsoft는 이전 버전에서이 작업을 수행했기 때문에 (DEBUG_NEW) 구현 특정 확장 프로그램이되었습니다. 여기서 분명히 또 다른 매크로와도 충돌하여 '새로운 것'을 정의합니다. James가 말했듯이, 도서관의 다른 부분에서는 새로운 배치를 사용하는 것과 갈등이 생깁니다. –

관련 문제