메모리 누수(leak) 감지 Programming/MFC2012/04/25 17:40
원인
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 |
프로그램이 종료되기 직전에 아직 해제되지 않는 메모리가 있는지 검사한다. |
'Programming > MFC' 카테고리의 다른 글
| 메모리 누수(leak) 감지 (0) | 2012/04/25 |
|---|---|
| Visual Studio 2010에서 "Press any key to continue" 가 나오게 하는 법 (0) | 2012/01/09 |
| [MFC] SDI나 MDI 의 시작시에 Splash Screen 넣기(Dialog) (0) | 2011/11/23 |
| [MFC] Window 창크기,위치정보 저장하기 (0) | 2011/11/17 |
| [MFC] Toolbar의 아이콘 제거 (0) | 2011/11/08 |
