본문 바로가기

프로그래밍 활용(TIP)

메모리 누수 탐지(_CrtDumpMemoryLeaks)


VS에서 메모리 누수를 탐지하기 위해서는 _CrtDumpMemoryLeaks()함수를 사용해 주면 된다. 이 함수는 메모리 릭이 의심되는 함수가 실행된 다음에 사용해 주면 되는데 보통 프로그램 마지막에 메모리를 검사하는데 사용하기도 한다.
_CrtDumpMemoryLeaks() 함수는 이 함수가 실행되는 그 시점을 기준으로 할당된 메모리가 해제되었는지 아닌지를 검사하기 때문이다. 그렇기 때문에 함수 안에서 할당하고 바로 다음에 검사하면 메모리 릭이 있다고 보고 한다. 이러한 이유로 보통 프로그램 마지막에 사용하는 경우가 많다.

1. [ 코드 ]
2. void Func()
3. {
4. int *p1 = (int*)malloc(4);
5. int *p2 = new int;
6. _CrtDumpMemoryLeaks();
7. free(p1);
8. free(p2);
9. }
10. [ 결 과 ]
11. Dected Memory leaks!
     Dumping objects ->
     {75} normal block at 0x00E54A78, 4 bytes long.
     Data: <   > CD CD CD CD
     {74} normal block at 0x00E54A38, 4 bytes long.
     Data: <   > CD CD CD CD
     Object dump complete.


_CrtDumpMemoryLeaks() 함수는 메모리 누수가 있으면 true를 반환한다. 이 함수를 사용하기 위해서는 <crtdbg.h> 파일을 추가해 줘야 한다.
_CrtDumpMemoryLeaks() 함수는 디버깅 모드일 때만 작동한다. new 는 실질적으로 malloc 를 사용하고 디버깅 모드일때는 malloc는 _nh_malloc_dbg를 사용한다. 이렇게 해서 디버깅 모드일 때는 메모리를 할당할 때 그 수와 순번을 정해 놓는다. 그래서 F5로 실행하면 이러한 정보들을 stderr에 출력해 준다. 그리고 이러한 정보들은 Output 창에 나타난다.

표시되어 지는 정보로 메모리 릭이 일어나는 곳으로 이동할 수 있는데 이 때는 _CrtSetBreakAlloc()함수를 사용하면 된다.
_CrtSetBreakAlloc() 함수는 인자로 {} 안에 있는 할당 번호를 넘겨주고 F5로 실행하면 그 곳에서 실행이 브레이크 된다. 이때 중요한 것은 메모리 릭 결과가 나타난 경우가 같은 환경으로 실행해야 한다는 것이다. 그렇지 않다면 할당되는 순서가 달라져서 다른 곳을 가르킬 수도 있다. 이렇게 브레이킹 되면 Call Steck창을 이용하여 자신이 작성한 코드쪽으로 갈 수 있다. 그리고 이 할당 번호는 자신이 할당한 순서와는 다르다. 프로그램은 내부적으로 많은 일들을 하므로 자신이 할당하지는 않았지만 다른 쪽에서 할당이 되었을 수도 있다.

[출처 : http://blog.naver.com/bokstory?Redirect=Log&logNo=70076537773 ]