블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

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

반응형
Posted by blueasa
, |