_CrtDumpMemoryLeaks() 을 이용한 메모리 누수 탐지법

작성자 : 김문규
최초 작성일 : 2009. 3.25

1. 들어가며
메모리 누수를 탐지는 방법은 매우 많습니다. 하지만, 실은 잘 모르는 경우가 많습니다. 매크로를 이용하시는 분도 있고, 툴을 사용하시는 분도 있고.... 다양한 방법이 있지만 이번 포스트에서는 _CrtDumpMemoryLeaks()라는 함수를 이용해서 간단하게 누수 지점을 탐지하는 법을 소개하겠습니다.

2. 문제의 코드
int main()
{
 char* pA = new char[20];
 return 0;
}

메모리를 할당하였지만, 이를 해제하고 있지 않습니다. (물론 해당 예제에서는 어플리케이션이 종료되기 때문에 상관없지만 할당 후 해제 하지 않았다는 점에 주목하세요.)

이렇게 간단한 코드이라면 상관없겠지만, 1000 라인 정도에 new만 50개 정도하는 모듈이라고 가정하면 delete[]를 빼먹는 것은 흔하게 있는 실수일 지도 모릅니다.

3. 탐지하기
#include <crtdbg.h>
int main()
{
 char* pA = new char[20];
 _CrtDumpMemoryLeaks();
 
return 0;
}

적색으로 표시된 2개의 코드를 삽입했습니다. 결과창은 다음과 같습니다.

메모리 누수가 발견되었다고 알려주네요. 그런데, 어딘지 잘 알 수없는 암호문 같네요.
하지만, 여기서 주목할 점은 {56} 입니다. {56}이라는 메모리 참조값을 가지는 지점이 해제되지 않았다는 뜻입니다.
그럼 {56}이 어떤 지점인지 찾으면 되겠네요~
그래서, 코드를 아래처럼 수정합니다.

#include <crtdbg.h>
int main()
{
 _CrtSetBreakAlloc(56);
 char* pA = new char[20];
 _CrtDumpMemoryLeaks();
 return 0;
}

그러면, {56} 메모리 지점을 생성하려고 할 때, 비줠스튜디오가 break할 것인지를 물어봅니다. 여기서, SHIFT+F11 신공으로 몇번만 함수를 빠져나오면 우리 코드 레벨에서 어떤 지점이 문제인지 알 수 있게 됩니다.


참 쉽죠잉~

4. 주의할 점
_CrtDumpMemoryLeaks() 이 함수는 호출되는 시점을 기준으로 해제되지 않은 메모리 영역을 알려주게 됩니다. 즉 정상적으로 delete 함수를 호출하는 코드라고 하더라도 CrtDumpMemoryLeaks()가 delete 함수보다 먼저 호출된다면, 메모리 누수로 감지하게 됩니다. 따라서, 함수의 위치에 따라서 지혜롭게 개발자가 잘 판단해야 합니다. 특히 전역변수의 경우를 잘 판단하셔야 겠지요.

5. 마치면서
메모리 누수는 꼭 피해야 하는 경우이며, 이를 위한 기술을 많이 가지고 있으면 좋습니다. 이 중에 가장 간편한 방법이 아닐까 합니다. 주의할 점만 확실히 이해하셨다면 매우 간편하지만 강력한 탐지법이 될 것입니다.