MFC에서 보면 아래와 같은 소스 코드가 있다.


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif // _DEBUG


이것에 대해 엄청난 궁금증이 있었지만 그려러니 하고 넘어갔었다.

그러던 중 우연치않게 이 용도를 알았다.

프로그래밍하던중 종료시에 "Detected memory leaks!" 이란 메시지를 우연찮게 발견했다.

아무래도 어디선가 new를 했다 delete 를 하지 못해 구천에서 떠도는 원혼의 소리 같은 필이팍! -_-;

하지만 어디서 나오는지 도저히 알 방법이 없었다.

힌트라도 주면 디버깅을 하겠지만 이건 뭐... 완존히... -_-;;

그래서 나름대로 사이트를 뒤적거리던중 ms 사이트에서 이걸 발견했다.

cpp 파일에다가 이걸 선언하면 (h에 하면 않된다.) 해결이 된다.


그렇다면 한번 예를 적겠다. 생성자에 아래와 같은 코드를 넣는다.

char *p = new char[4444];


물론 고의 적으로 delete p; 를 하지 않는다.


#define new DEBUG_NEW를 cpp 꼭대기에 선언하지 않았을 경우 디버그 모드로 실행하다

종료하면 디버깅창에 아래와 같은 메시지가 나온다. 몇번지에 몇 바이트까지 나온다.

원혼이 떠도는지는 알겠지만 원인은 모른다. ㅠㅠ


Detected memory leaks!
Dumping objects ->
{71} normal block at 0x00E1B748, 4444 bytes long.
Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.


#define new DEBUG_NEW를 해당 cpp 꼭대기에 선언한 경우는 종료시 아래와 같이 나온다.


Detected memory leaks!
Dumping objects ->
C:\어쩌고저쩌고\Test.cpp(172) : {71} normal block at 0x00E1B748, 4444 bytes long.
Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.


아! 얼마나 훌륭한가?

만약 선언되지 않은 cpp에 메모리 릭이 발생된다면 위치는 가르쳐 주지 않을것이다.

이제 원인을 아니까 성불 시킬수 있을것이다! (일본만화를 너무 많이 봤나? -_-)

모든 클래스의 사이즈를 외운다면 필요없겠지만.. 못외우는 분은 알고 있으면 좋을것 같다. ^^


이런 삽질을 반복하고 나서 이 코드의 의미를 알게 되었다.

이 덕분에 리소스 관리자의 버그를 찾아내었다. ^^;;

바꿔 말하면 버그 있는지 모르고 게임이 나올뻔했다. -_-;


ps... 이것은 어디까지나 MFC에 한해서 작동된다. 따라서


#ifdef _AFXDLL
#ifdef
_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif // _DEBUG

#endif // _AFXDLL


라고 쓰는 것이 좋을 것이다.



알아낸곳은

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvissdk/html/vissdk.asp


좀더 자세한 정보가 있는곳을 찾았다.

http://www.michaelmoser.org/memory.htm

'도서관 I > MFC' 카테고리의 다른 글

[바람이] CCommanDialog Class  (0) 2005.09.26

+ Recent posts