본문 바로가기

컴퓨터 과학 & 영상처리 관련/Debug / Programming

메모리 릭 체크


*포인터나 new로 생성한 부분에 대해 기록하고 해당 변수들에 대해 사용내역을 계속 출력하게 할 수 있으면

어떤 변수는 해제가 되었고 어떤 변수는 해제가 되었는지 비교 가능하다. 근데 cpp, c 파일을 라인단위로 가져오기가 힘들고, 뭐 이래저래 문제가 많다. 

근데 이건 좀 간단하게 짜기에는 시간이 많이 걸렸기에 이와 같이 메모리 릭 체크 툴을 사용하기도 함. 그러나 어떤 위치의 어떤 변수인지는 알 수 있음.

상속을 하는 경우 부모 클래스 소멸자를 virtual로 만들어야 자식 클래스 소멸자가 불린다고 하니 참고. 



Visual studio에서 체크 툴


1. CRT(C Runtime) 라이브러리 사용 방법

http://www.slideshare.net/agebreak/c-lab-10

http://msdn.microsoft.com/ko-kr/library/x98tx3cf.aspx

http://msdn.microsoft.com/ko-kr/library/x98tx3cf(v=vs.100).aspx

http://stackoverflow.com/questions/10952731/error-c2661-cobjectoperator-new-no-overloaded-function-takes-4-arguments


이 방법은 visual studio 자체 제공 같고...그냥 헤더, #define, #ifdef 그리고 아래의 것을 한번 실행하게 소스 추가 후 F5(디버그모드)로 실행 후 종료되면 됨

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);



결과








2. 메모리 누수 확인 툴_VLD(Visual Leak Detector) 사용 방법

http://limjh77.egloos.com/viewer/10967509

http://blog.naver.com/PostView.nhn?blogId=envisat&logNo=60151892164

http://vld.codeplex.com/documentation

https://vld.codeplex.com/



1. VDL 라이브러리를 설치
2. 해당 프로젝트의 속성에서 몇가지 수정 (VS2010)
   - Property Pages->Configuration Properties->VC++ Directories->Include Directories = C:\Program Files (x86)\Visual Leak Detector\include;$(IncludePath)
   - Property Pages->Configuration Properties->VC++ Directories->Library Directories = C:\Program Files (x86)\Visual Leak Detector\lib\Win64;$(LibraryPath)
3. VDL의 bin 폴더에 있는 dll 파일 두개를 실행파일 폴더 복사
4. #include <vld.h>추가



결과
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x0000000000D300B0: 50000 bytes ----------
  Call Stack:
    d:\current_working\memory test\memory test\memory test.cpp (17): memory test.exe!func + 0xA bytes
    d:\current_working\memory test\memory test\memory test.cpp (35): memory test.exe!wmain
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crtexe.c (552): memory test.exe!__tmainCRTStartup + 0x19 bytes
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crtexe.c (371): memory test.exe!wmainCRTStartup
    0x00000000772159ED (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0xD bytes
    0x000000007734C541 (File and line number not available): ntdll.dll!RtlUserThreadStart + 0x21 bytes
  Data:
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........


Visual Leak Detector detected 1 memory leak (50052 bytes).
Largest number used: 50052 bytes.
Total allocations: 50052 bytes.
Visual Leak Detector is now exiting.
The program '[3376] memory test.exe: Native' has exited with code 0 (0x0).