2012-10-03 2 views
3
에 구글 테스트를 사용하는 경우

나는 다음과 같은 코드를 실행하면 :메모리 누수 윈도우

#include "gmock/gmock.h" 
#include "gtest/gtest.h" 

#define _CRTDBG_MAP_ALLOC 
#include <crtdbg.h> 

int main(int argc, char **argv) 
{ 
    ::testing::InitGoogleTest(&argc, argv); 
    _CrtDumpMemoryLeaks(); 
    return 0; 
} 

나는 다음과 같은 출력을 얻을 :

Detected memory leaks! 
Dumping objects -> 
{652} normal block at 0x00074CE0, 4 bytes long. 
Data: <L> 98 4C 07 00 
{651} normal block at 0x00074C98, 12 bytes long. 
Data: <,   > 2C 03 1B 01 00 00 00 00 00 00 00 00 
{650} normal block at 0x00074C50, 8 bytes long. 
Data: <hI  > 68 49 07 00 00 00 00 00 
{649} normal block at 0x00074C10, 4 bytes long. 
Data: <t > 74 03 1B 01 
{648} normal block at 0x00074BC8, 8 bytes long. 
Data: <xK  > 78 4B 07 00 00 00 00 00 
{647} normal block at 0x00074B70, 28 bytes long. 
Data: <   K L > BC 01 1B 01 01 CD CD CD C8 4B 07 00 E0 4C 07 00 
{646} normal block at 0x00074B28, 8 bytes long. 
Data: < I  > 18 49 07 00 00 00 00 00 
{645} normal block at 0x00074AE0, 8 bytes long. 
Data: < I  > 04 49 07 00 00 00 00 00 
{644} normal block at 0x00074A98, 8 bytes long. 
Data: < H  > DC 48 07 00 00 00 00 00 
{643} normal block at 0x00074A50, 8 bytes long. 
Data: < H  > C8 48 07 00 00 00 00 00 
{642} normal block at 0x00074A08, 8 bytes long. 
Data: < H  > B4 48 07 00 00 00 00 00 
{641} normal block at 0x000749C0, 8 bytes long. 
Data: < H  > A0 48 07 00 00 00 00 00 
{640} normal block at 0x00074E90, 1 bytes long. 
Data: < > 00 
{639} normal block at 0x00074870, 272 bytes long. 
Data: <  t N > 20 03 1B 01 CD CD CD CD 74 FA 1B 01 90 4E 07 00 
{638} normal block at 0x00074F68, 72 bytes long. 
Data: <C:\Users\Baz> 43 3A 5C 55 73 65 72 73 5C 45 42 41 52 47 52 49 
{637} normal block at 0x00074E48, 8 bytes long. 
Data: <hO G > 68 4F 07 00 47 00 00 00 
{616} normal block at 0x00074EE0, 72 bytes long. 
Data: <C:\Users\Baz> 43 3A 5C 55 73 65 72 73 5C 45 42 41 52 47 52 49 
{595} normal block at 0x00074828, 8 bytes long. 
Data: <  > F0 F9 1B 01 00 00 00 00 
{594} normal block at 0x000747E8, 1 bytes long. 
Data: < > 00 
{561} normal block at 0x000747A0, 5 bytes long. 
Data: <fast > 66 61 73 74 00 
{496} normal block at 0x00074760, 1 bytes long. 
Data: < > 00 
{311} normal block at 0x00074720, 1 bytes long. 
Data: < > 00 
{282} normal block at 0x000746E0, 2 bytes long. 
Data: <* > 2A 00 
{253} normal block at 0x00074698, 5 bytes long. 
Data: <auto > 61 75 74 6F 00 
Object dump complete. 

내가 잘못하고있는 중이 야 무엇을?

답변

3

: 여기

구글의 대답은 FAQ를 테스트의 정적 초기화 구글 테스트 싱글 힙, 비주얼 C에 할당을 필요로하기 때문에

++ 메모리 누수 감지기는 프로그램이 끝날 때 메모리 누수를보고합니다. 이를 방지하는 가장 쉬운 방법은 _CrtMemCheckpoint 및 _CrtMemDumpAllObjectsSince 호출을 사용하여 정적으로 초기화 된 힙 개체를보고하지 않는 것입니다. 자세한 내용 및 추가 힙 확인/디버그 루틴은 MSDN을 참조하십시오.

_CrtMemCheckPoint 직후 ::testing::InitGoogleTest를 호출하고 RUN_ALL_TESTS()_CrtMemDumpAllObjectsSince를 호출 포함한다. 주요 기능은 조금 다음과 같습니다 : 불행하게도

::testing::InitGoogleTest(&argc, &argv); 
// Get a checkpoint of the memory after Google Test has been initialized. 
_CrtMemState memoryState = {0}; 
_CrtMemCheckpoint(&memoryState); 
int retval = RUN_ALL_TESTS(); 

// Check for leaks after tests have run 
_CrtMemDumpAllObjectsSince(&memoryState); 
return retval; 

, 테스트가 구글 시험이 완벽한 해결책이 아니다 의미 메모리 누수를 일으키는 실패합니다.

+2

는 불행히도에 충분하지 않습니다 gtest-1.7.0 해제되지 않습니다 RUN_ALL_TESTS 내에서 gtest의 할당은 @kerim 언급으로 UnitTestImpl이 :: 예를 – kerim

+1

에 대한 os_stack_trace_getter'가 혼자 _CrtMemCheckpoint 접근 방식으로 인해 충분하지 않다'확인이 있습니다 UnitTestImpl :: os_stack_trace_getter'에서 수행되는 정적 할당 내 해킹책은 메모리 검사 점 앞에 항상 더미 테스트를 실행하는 것이 었습니다. 이렇게하면 하나의 추가 프리앰블 테스트가 추가되지만 적어도 누출 여부를 확인할 수 있습니다. 팁 :'testing :: GTEST_FLAG (filter) = "DummyTestName *"'을 사용하여 더미 테스트 만 실행 한 다음':: testing :: GTEST_FLAG (filter) = "-DummyTestName *"'을 나머지를 실행할 때 제외하십시오. –