VC++환경에서 메모리릭을 찾기 위한 방법은 디버그 모드에서 CRT(C runtime library)디버그 함수를 사용


1. 밑에 선언하는 방법


- _CrtDumpMemoryLeaks()함수로 메모리릭 찾기

  #define CRTDBG_MAP_ALLOC

  #include <stdlib.h>

  #include <crtdbg.h>

  //위의 순서를 반드시 지켜야 함


  void memleak()
  {
      // 메모리가 누수가 일어나는 부분

  }                                                    


  void main()
  {
   memleak();

  _CrtDumpMemoryLeaks();
  }

_CrtDumpMemoryLeaks() 함수를 사용하여 메모리릭을 찾는 방법을 사용시는 반드시 메모리릭이 발생된 이후 시점에서 이 함수를 호출해야만 누수된 메모리 블록 정보를 확인할 수 있다.


2. 위에 선언하는 방법

- _CrtSetDbgFlag()함수로 메모리릭 찾기==> 프로그램 시작부분에 함수 호출

  _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); 호출


#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <string.h>
#include <crtdbg.h>

void memleak()
{
  ... // (메모리 누수가 일어나는 부분)

}

void main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
memleak();
}


[옵션들]

_CRTDBG_ALLOC_MEM_DF - 메모리 할당이 일어나는 경우 추적하게 해줍니다.

_CRTDBG_LEAK_CHECK_DF - 종료시에 _CrtDumpMemoryLeaks()를 호출하여 메모리 누수 정보를 표시해 줍니다.

_CRTDBG_DELAY_FREE_MEM_DF - 실행중간에 메모리가 해제 된다고 하더라도 실제로 해제를 실행하지 않고 종료 시 해제를 하게 합니다.

_CRTDBG_CHECK_ALWAYS_DF - 모든 할당 및 할당 취소에서 _CrtcheckMemory를 호출하여 실행속도는 지연되지만 오류를 신속하게 찾아냅니다.

_CRTDBG_CHECK_CRT_DF - CRT내부도 메모리 탐지에 포함 시킵니다.


3. New메모리에 CRT기능 넣기

위에 1,2번 기준으로 디버깅을 돌려보면은 메모리 누수 정보는 나오지만 new 메모리 할당시에는

정확한 정보가 나오지 않는다

아래와 같이 고치면 정확한 정보가 뜰 것이다.


#include <stdio.h>
#include <string.h>
#include <crtdbg.h>

//디버그용  new
#ifdef _DEBUG
#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)
#endif

int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);


...


return 0;
}


[참고]

기본적으로 MFC에서는 위 코드를 활용할 필요가 없다.

왜냐면 메모리 누수 관련 코드가 만들자마자 자동 삽입되기때문이다.


출처 : 네이버 게임 프로그래밍 카페

Posted by Gungume
,