반응형


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

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

{67} normal block at 0x00032528, 68 bytes long.
Data: < & X' ' > 10 00 00 00 C0 26 03 00 58 27 03 00 E8 27 03 00

{68} normal block at 0x000322A2, 62 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

이는 CRT(C Runtime Library)에서 메모리 누수를 감지하여 화면에 보여주는 것인데, 메모리를 할당한후 해제하지 않았음을 보여준다.
간단하게 살펴보면,
{67} 은 메모리가 할당된 순서이고,
0x00032528 는 메모리 주소이고,
Data: < 는 메모리에 있는 실제 데이터의 내용이다.

하지만 위의 메세지로는 아무것도 할수가 없다. 도대체 더 문제가 어디서 발생했는지 알 방법이 없다.
만약 코드가 길지 않다면, 천천히 재검토하여 찾아낼수 있겠지만,
코드의 길이가 길 경우, 일일히 다 찾아볼수 없는 노릇이다.
(프로그램은 시간과의 싸움인데, 디버깅하다 시간을 다 보낼수 없는 것이다.)

처리방법
이럴때 어떻게 해야 해야 할까?
다행히 VS 에서는 메모리 누수를 간단한 방법으로 감지할수 있게 도와 주는 기능이 있다.
(디폴트 값으로 사용안함으로 되어 있기 때문에 잘 모르는 사람이 많고, 이 기능을 이용하면,
메모리 누수가 탐지된 파일과 라인을 알수 있다.)


<stdafx.h> 파일의 상단에
#define _CRTDBG_MAP_ALLOC
를 추가하고,
메모리 누수 탐지를 시작할 부분에
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
를 추가해주면 끝이다.


_CrtSetDbgFlag(..):
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 : 프로그램이 종료되기 직전에 아직 해제되지 않은 메모리를 있는지 검사한다.


반응형

+ Recent posts