컴퓨터공부/C & C++ & STL

메모리 릭(메모리 유출, memory leak)을 잡아보자

achivenKakao 2007. 9. 7. 14:23
 많은 프로그래머들이 프로그램을 짜면서...

메모리 릭을 많이 발생시킵니다..

대수롭지 않게 생각하는 프로그래머들이 많은데..

실상은 가장 심각한 버그 중에 하나입니다..

당부 말씀드리자면...

제발 그러지 말아 주세요.. ㅎㅎ


그럼 메모리 릭을 어떻게 잡아야할까요..

코드 짤때부터 새지 않도록 짜는게 중요하지만..

인간인 이상 완벽할 수 없습니다..

그럴땐 도움을 받아야 합니다..

다음 코드 보시죠..

#include <crtdbg.h>

#ifdef _DEBUG
#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)
#endif

void main()
{
 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

 int* a = new int;
}

첫 매크로는 기존의 new를 파일과 라인정보를 포함한 new로 바꾼거구요..

_CrtSetDbgFlag 함수는 프로그램을 종료후에 메모리 릭 정보를 출력하는 겁니다..

돌려볼까요?

이때 반드시 Debug 모드에서 F5로 실행하셔야 합니다..

etected memory leaks!
Dumping objects ->
d:\project\test\printmyself\main.cpp(11) : {57} client block at 0x003A5E60, subtype 0, 4 bytes long.
 Data: <    > CD CD CD CD
Object dump complete.
The program '[2368] PrintMyself.exe: Native' has exited with code 0 (0x0).

아주 재밌는 내용이 출력 됩니다

main.cpp의 11번째 라인에서 4바이트의 메모리가 새는데..

그 안의 내용은 0xCD 0xCD 0xCD 0xCD 라는 겁니다.. (디버그 모드에서 new를 한경우 자동으로 저렇게 초기화 해줍니다~)

당장 밑에다가 'delete a;'를 넣어야 겠다는 생각이 팍팍 들지 않습니까?


지금 작성하고 계신, 아니면 기존에 작성한 코드에 추가한 후 테스트 해 보세요..

만약 새는 메모리가 하나도 없다면..

당신은 훌륭한 프로그래머입니다...


즐거운 프로그래밍 생활 되시길~ ^^


p.s. 출력 결과를 이쁜 표로 보고 싶다면, 'BoundsChecker'라는 프로그램을 사용해보시길...