정확하게 출처가 어디인지는 모르겠지만 ;;;
도움이 되었으면 합니다.
동적으로 생성하고 delete을 안한경우 비주얼C++에서 알아내는 방법입니다..
VC++에서만 됩니다.
일단 밑의 코드를 컴파일 해보시고, F5(디버그 실행) 키를 누르면 컴파일러 출력창에
몇바이트의 메모리가 해제를 안했는지 알려줍니다.
#ifdef _DEBUG
#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)
#endif
은
디버그 모드에서만 작동됩니다..
void StartDebug()
{
_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
}
그리고 이거는 맨처음 해주어야 합니다.. 자세히는 모르겠고, 걍 저렇게 ^^;;
코드:
#include <stdio.h> #include <string.h> #include <crtdbg.h> // 디버그용 new #ifdef _DEBUG #define new new(_CLIENT_BLOCK, __FILE__, __LINE__) #endif void StartDebug() { _CrtSetDbgFlag( _CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF ); } int main() { StartDebug(); char* s1; char* s2; s1 = new char[128]; strcpy(s1, "string1"); s2 = new char[256]; strcpy(s2, "string2"); delete[] s1; return 0; } |
디버그 상태로 실행하고 실행파일이 종료되면.. 밑에쪽 VC++ 컴파일러 메세지창에
이런식으로. 나옵니다.. (VC++6에선 다 영어로 나옴)
----------------------------------------------------------------------------
'debug.exe': 'C:\temp\debug\Debug\debug.exe' 로드, 기호가 로드되었습니다.
'debug.exe': 'D:\WINXP\system32\ntdll.dll' 로드, 기호가 로드되지 않았습니다.
'debug.exe': 'D:\WINXP\system32\kernel32.dll' 로드, 기호가 로드되지 않았습니다.
Detected memory leaks!
Dumping objects ->
c:\temp\debug\main.cpp(25) : {44} client block at 0x003710B0, subtype 0, 256 bytes long.
Data: <string2 > 73 74 72 69 6E 67 32 00 CD CD CD CD CD CD CD CD
Object dump complete.
'[3340] debug.exe: 기본' 프로그램이 0 (0x0) 코드에서 끝났습니다.
----------------------------------------------------------------------------
위에 내용에서..
c:\temp\debug\main.cpp(25) : {44} client block at 0x003710B0, subtype 0, 256 bytes long.
Data: <string2 > 73 74 72 69 6E 67 32 00 CD CD CD CD CD CD CD CD
main.cpp의 25번째 줄에서 new한 256바이트가 해제 안했다고 그러네여
delete 잘 까먹고 안하는 분들은 필수!! ^^;;
------------------------------------
가장 간단한 방법이군요.