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
좀더 자세한 정보가 있는곳을 찾았다.
'도서관 I > MFC' 카테고리의 다른 글
[바람이] CCommanDialog Class (0) | 2005.09.26 |
---|