메모리 누수

메모리 누수는 new등으로 동적할당한 메모리를 올바르게 할당 해제 하지 않는 경우 발생합니다. 적은 메모리 누수는 초반에 알아차리기 힘들지만 시간이 흐르고 나서 메모리가 부족해 지고, 성능 저하에서 치명적인 오류까지 발생할 수 있습니다.

C++에서 메모리 누수 확인

따라서 메모리 누수를 확인하고 올바르게 할당을 해제하여 위와 같은 문제를 방지할 수 있습니다. Visual StudioCRT 라이브러리(C 런타임 라이브러리)를 이용하여 메모리 누수를 감지할 수 있습니다.

1
2
3
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

코드 상단에 위의 코드를 작성하여 디버그 힙 함수를 사용하도록 설정한후 프로그램 종료지점에서 CrtDumpMemoryLeaks를 호출하면 메모리 누수에 대한 보고서를 확인할 수 있습니다.

예시 1

1
2
3
4
5
6
7
8
9
10
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

int main(void) {
char* a = new char[1024];

_CrtDumpMemoryLeaks();
return 0;
}

위에 코드에서 char형의 1024바이트의 배열을 생성한 후, 할당 해제하지 않았으므로 메모리 누수가 발생합니다. 비쥬얼 스튜디오에서 F5를 눌러 디버깅을 시작하면 종료후에 출력창에서 결과를 확인할 수 있습니다.

예시 화면 1

보고서 분석

  • 메모리 할당 번호(81)
  • 블록 형식(normal).
  • 16진수 메모리 위치(0x015908C0).
  • 블록 크기(1024 bytes).
  • 블록 내 데이터의 처음 16바이트(16진수 형식)

예시 2

위의 예시에서는 메모리 누수가 발생한 위치를 알려주지 않습니다. 메모리 누수가 발생하는 위치를 알고싶다면, new연산자의 블록 형식, 파일, 줄번호를 매개변수로 사용하는 오버로드를 사용해야합니다.

1
2
3
#ifdef _DEBUG
#define new new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#endif

위의 코드를 배치하여 new연산자를 위의 오버로드로 정의합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

#ifdef _DEBUG
#define new new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#endif

int main(void) {
char* a = new char[1024];

_CrtDumpMemoryLeaks();
return 0;
}

예시 화면 1

이제 메모리 누수에 대한 파일과 코드의 라인수등과 같이 더 자세한 정보를 보여주는 보고서를 확인할 수 있습니다.