2013-07-03 2 views
3

우리는 테스트중인 코드에서 메모리 누수를 감지하기 위해 Win32 _CrtMemCheckpoint/_CrtMemDifference 메서드를 사용하는 몇 가지 단위 테스트를 수행합니다. x64 시스템 (Windows 7)에서 이러한 테스트 중 일부는 x86 (32 비트) 시스템에서보고되지 않는 메모리 누수를보고합니다. VS2008 또는 VS2012 중 하나에 다음 코드를 컴파일하고 부스트 1.52.0를 사용하여 이러한 64 기계,에, 결과는 "메모리 누수 감지!"입니다 :boost :: filesystem :: path 메모리 차이를 야기 함

#include <boost/filesystem.hpp> 
#include <crtdbg.h> 

int main(int argc, char **argv) 
{ 
    _CrtMemState state1, state2, state3; 
    _CrtMemCheckpoint(&state1); 

    { 
     boost::filesystem::path remoteDirPath("c:/"); 
    } 

    _CrtMemCheckpoint(&state2); 

    int res = _CrtMemDifference(&state3, &state1, &state2); 
    if (res != 0) 
    { 
     _CrtDumpMemoryLeaks(); 
     std::cout << "Memory leak detected!"; 
    } 
} 

부스트 : : 파일 시스템이 실제로 메모리 누수가 : :통로?

int main(int argc, char **argv) 
{ 
    { 
     boost::filesystem::path initDummy("c:/"); 
    } 
    _CrtMemState state1, state2, state3; 
    _CrtMemCheckpoint(&state1); 

    { 
     boost::filesystem::path remoteDirPath("c:/"); 
    } 

    _CrtMemCheckpoint(&state2); 

    int res = _CrtMemDifference(&state3, &state1, &state2); 
    if (res != 0) 
    { 
     _CrtDumpMemoryLeaks(); 
     std::cout << "Memory leak detected!"; 
    } 
} 

은 "메모리 누수가 감지되었습니다!"라는 메시지를 출력하지 않기 때문에 일부 라이브러리 초기화 또는 그럴 것 같습니다.

내 질문은 : 어떻게 단위 테스트와 같은 문제를 피할 수 있습니까? 솔루션 테스트를 시작하기 전에 이러한 변수를 초기화합니까? 다른 코드를 사용할 때 더 많은 일을해야합니까? 아니면 일반적으로 그런 테스트를하는 것은 나쁜 생각입니까?

의견을 보내 주셔서 감사합니다.

답변

1

두 번째 코드 샘플로 인해 boost :: filesystem :: path는 정적 내부 상태 (프로그램 끝까지 할당 된 채로 남아 있음)를 초기화한다고 말합니다.

단위 테스트에서 어떻게 이러한 문제를 피할 수 있습니까?

첫 번째 메모리 검사 점을 가져 오기 전에 실행하는 테스트 초기화 방법을 만듭니다.

이상적으로는 (새로운/삭제를 덮어 쓰거나 사용자 정의 할당 자 추가 등) 추적하기 위해 할당 및 할당 해제를 사용자 정의 할 수 있어야하지만 사용하는 라이브러리에 따라 더 어렵고 허용되지 않을 수도 있습니다 .

해결책을 테스트하기 전에 이러한 변수를 초기화합니까?

해결 방법입니다. 별로 우아하지는 않지만, 결국 당신이 알고 싶은 것을 말하고 있습니다.

다른 코드를 사용할 때 더 많은 것들을해야합니까?

사용중인 라이브러리와 유연성에 따라 다릅니다. 자신이 소유 한 코드를 테스트하는 경우 내부적으로 할당 자 유형 (할당을 추적하기 위해 사용자 정의 할 수있는 std :: allocator), 새 사용자 정의 및 삭제 또는 여러 구현을 제공 할 수있는 일부 할당 API 작성을 고려해야합니다.

또한 _CrtMem * Windows API에 명시 적으로 의존하지 않는 테스트 코드를 사용할 수도 있습니다 (boost :: test 라이브러리에는 메모리 누수를 감지하는 런타임 매개 변수가 있으므로 실제로 구현하지 않아도되지만, Win64에서 무엇이하고 있는지 알 수 있습니다.

관련 문제