프로그램을 디버깅하다가 종료를 할경우 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 을 넣어야 한다.

2006/10/02 23:39 2006/10/02 23:39

글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

덧글을 달아 주세요

  1. 이상곤 2008/09/26 10:22 고유주소 고치기 답하기

    감사합니다.^^
    덕분에 보름동안 어딘지 못찾고 있던 릭 발생 위치를 찾았습니다. 아직 해결은 못했지만요.ㅠㅠ
    그리고 이건 사족인데 전 VC6.0을 사용하는지라 dll때문에 잠깐 고민 좀 했는데 전 msvcrtd.dll로 하니깐 잘 잡히던군요.

  2. ice cube maker 2011/04/19 16:52 고유주소 고치기 답하기

    감사합니다.^^