[펌] 비주얼 스튜디오 _CrtDumpMemoryLeaks() 을 이용한 메모리 누수 탐지법
1. 개요
_CrtDumpMemoryLeaks() 라는 함수를 이용해서 메모리 누수와 누수 지점을 알아내는 기법을 알아본다.
2. 탐지하기
#define CRTDBG_MAP_ALLOC
#include <crtdbg.h>
void main()
{
char *ptr = new char[20];
_CrtDumpMemoryLeaks();
}
여기서 {100} 라는 숫자를 보자...
{100 } 이라는 위치에서 할당받은 메모리가 해제가 안된체로 남아있다는 말이기 때문에 그위치에서 브래이크걸도록 만들면
원인을 일으킨 위치를 알아낼수있다.
void main()
{
_CrtSetBreakAlloc(100);
char *ptr = new char[20];
_CrtDumpMemoryLeaks();
}
CrtSetBreakAlloc함수를 시작위치에 두고 다시 컴파일 하여 실행을 시켜보자.
char *ptr = new char[20]; 위치에서 브래이크 걸릴것이다.
이런식으로 메모리 누수를 잡아낼수있다.
3. 주의사항
mfc용 어플리캐이션은 자동으로 메모리 누수 탐지가 되지만 일반 원도우 어플이나 콘솔어플은 이방법을 사용 해야만 메모리 누수를 알수있다.
_CrtDumpMemoryLeaks(); 가 호출되는 시점에서 해제 안된 메모리를 덤프하므로 꼭 프로그램 종료 직전에 써줘야 정확한 메모리 누수여부를 알수잇다.
_CrtDumpMemoryLeaks();
delete somePtr;
이렇게 되면 메모리 릭이 덤프된다.
또한
STL 사용시 제데로 릭을 검출 하지못하고 무조건 메모릭으로 판단하는 경우가 있다.
void main()
{
std::string str("http://jga.or.kr");
_CrtDumpMemoryLeaks();
}
이코는 문제가 없지만 str이 아직 중괄호 범위를 벋어나지 않았으므로 여전히 해제가 안된것으로 간주하여 메모릭으로 출력한다.
이때는 ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 를 사용해서 릭을 검출할수있다.
void main()
{
::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
std::string str("sasa");
char *ptr = new char[20];
//_CrtDumpMemoryLeaks();
}
이렇게 해주면 str에 대해서는 메모리릭이 발생하지않는다.
출처 : http://cafe.naver.com/jcga/883