프로그램을 디버깅하다가 종료를 할경우 output 창에 메모리릭이 발생했다는 창을 종종 보게 된다.
Detected memory leaks!
Dumping objects ->
{10555} normal block at 0x003B7C50, 33 bytes long.
Data: < 2| > D8 9C 32 7C 0B 00 00 00 10 00 00 00 01 00 00 00
프로그램이 수행되면서 10555번째로 new 를 수행하여 할당된 0x003B7C50 번지에 33바이트짜리 릭이 발생했다는 것이다.
코딩한 부분중에 의심 갈만한 new 가 어림직히 생각 나는경우 쉽게 해결할 수 있지만, 만일 프로젝트가 커진 상황이나,
여러명이 동시에 하나의 소스를 만지고 있을경우에는 이러한 부분을 찾기가 힘들어 진다. 이런상황에서 쉽게 찾을수
있는 방법을 소개한다.
가장 먼저 수행이 되는 파일(stdafx.h 같은곳)에 아래의 내용을 선언해 준다.
#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
그리고 가장 먼저 수행되는 코드에 break point 를 건다.
main()
{
int a; // 이곳에 브포를 걸어 줍니다. 가장 먼저 수행되는 코드..
int b;
int* c = new int[100];
// .. 쭉 코딩된곳..
}
debug 모드로 수행하면 main 바로 아랫 break point 에서 멈추게 된다.
그러면 Watch 창을 열고
이름 부분에 {,,msvcr71d.dll}_crtBreakAlloc
값 부분에 10555 를 넣는다.
그리고 계속 시작(F5)를 누르게 되면 해당되는 new 위치에서 수행이 멈추게 된다.
프로젝트가 단일쓰레드 프로그램이라면 윗 watch 창 이름 부분에
_crtBreakAlloc 을 넣어야 한다.
덧글을 달아 주세요
이상곤 2008/09/26 10:22 고유주소 고치기 답하기
감사합니다.^^
덕분에 보름동안 어딘지 못찾고 있던 릭 발생 위치를 찾았습니다. 아직 해결은 못했지만요.ㅠㅠ
그리고 이건 사족인데 전 VC6.0을 사용하는지라 dll때문에 잠깐 고민 좀 했는데 전 msvcrtd.dll로 하니깐 잘 잡히던군요.
ice cube maker 2011/04/19 16:52 고유주소 고치기 답하기
감사합니다.^^