[펌] 비주얼 스튜디오 _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
'Tip & Tech' 카테고리의 다른 글
[펌] !!a (0) | 2011.06.08 |
---|---|
[펌] C Runtime 환경의 메모리 릭 잡는 방법 ( Memory Leak ) (0) | 2011.06.08 |
송창규, “unity build로 빌드타임 반토막내기”, Nexon Developer Conference, May 2010 (0) | 2011.05.30 |
Visual Studio 2003~2008 ATL Security Update 관련..(재배포 문제..) (1) | 2011.05.25 |
프로그램의 설계시에 알아야 할 좋은 코딩 습관 (0) | 2011.05.22 |