티스토리 툴바


달력

05

« 2012/05 »

  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
2012/04/25 17:40

메모리 누수(leak) 감지 Programming/MFC2012/04/25 17:40

출처 : http://whiteat.com/27812

 

원인

 

new, malloc 으로 메모리를 할당하여 사용한 후, 메모리에서 해당영역을 해지하지 않게 되면 메모리 누수 현상이 발생한다.

 

 

현상

 

VS로 디버깅을 한번이라도 해 봤따면 아래와 같은 메세지를 본 적이있을 것이다.

 

{200} normal block at 0x00032528, 68 bytes long.

Data : <                > 10 00 00 00 C0 26 03 00 58 27 03 00 E8 27 03 00

이는 CRT(C Runtime Library)에서 메모리 누수를 감지하여 화면에 보여주는 것인데,

메모리를 할당한 후 해제하지 않았음을 보여준다.

간단하게 살펴보면

 

{200} 은 메모리가 할당된 순서이고,

0x00032528 은 메모리 주소이고,

Data : <                    > 메모리에 들어있는 실제 데이터의 내용과 해당 메모리의 처음 16Byte 내용이다.

 

하지만 위의 메세지로는 아무것도 할 수가 없다. 문제가 어디서 발생하였는지 알 수가 없다.

만약 코드길이가 길지 않다면, 천천히 재검토해서 찾아낼 수는 있겠지만

코드의 길이가 길다면 어디서 할당을 하고 해제를 하지 않았는지 확인할 길이 없어진다.

 

 

처리방법

 

다행히 VS에서는 메모리 누수를 간단한 방법으로 감지할 수 있게 도와 주는 기능이 있다.

(디폴트 값으로 사용안함으로 되어 있기 때문에 잘 모르는 사람이 많고,

 이 기능을 이용하면 메모리 누수가 탐지된 파일과 라인을 알 수 있다.)

 

<stdafx.h> 파일 상단에  아래 내용을 추가한다.

 

#define _CRTDBG_MAP_ALLOC

 

이후,  메모리 누수 탐지를 시작할 부분에 아래 내용을 추가 해 주면 끝이다.

 

CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

 

 

 _CrtSetDbgFlg(int);

  CRT디버거의 플래그 설정함수.

  파라미터에 따라 디버깅 옵션이 달라지므로 주의 요망

 _CRTDBG_ALLOC_MEM_DF

  디폴트로 켜져 있으며,  DEBUG MODE 에서 모든 메모리 할당이 일어날

  때마다 메모리 메세지를 알리게 하는 옵션이다.

  이 플래그는 당연히 항상 ON 해야 한다.

 _CRTDBG_DELAY_FREE_MEM_DF

  delete, free 등으로 삭제할 때 메모리에서 바로 삭제되지 않고,

  CRT에서 보관하다가 프로그램 종료시에 완전히 삭제된다.

 _CRTDBG_CHECK_ALWAYS_DF

  모든 메모리관련 연산에서 _CrtCheckMemory를 호출한다.

 _CRTDBG_CHECK_CRT_DF

  CRT가 내부적으로 할당한 블록도 메모리를 체크할 때 사용한다.

  일반적으로 사용하지 않는다.

 _CRTDBG_LEAK_CHECK_DF

  프로그램이 종료되기 직전에 아직 해제되지 않는 메모리가 있는지 검사한다.

 

Posted by Begginer