2009. 9. 24. 16:35

non-MFC에서 손쉽게 Memory Leak 발견하고 해결하기

아래 코드를 보시면, 쉽게 이해할 수 있습니다.
두가지 방법을 알려드립니다.

보통, MFC에서는 별다른 조치없이도 똑같은 효과를 볼 수 있지만,
MFC를 쓰지 않는 경우에는 아래 코드와 같이,

_CrtSetReportMode(...) / _CrtDumpMemoryLeaks(...)

혹은

_CrtSetReportMode(...) / _CrtMemCheckpoint(...) / _CrtMemDifference(...) /
_CrtMemDumpAllObjectsSince(...) / _CrtMemDumpStatistics(...)

호출이 필요합니다.
물론, DEBUG 모드로 실행될때에만 leak 관련 보고를 받을 수 있습니다.

F5로 실행하면, non-MFC에서도 MFC 일때와 같이 아래의 친숙한 보고를 받을 수 있습니다.


참고1)
MFC에서는 new를 DEBUG_NEW로 했기 때문에, Leak 발생한 정확한 위치를 알려줍니다. (line 단위)
아래 코드에서도 new 대신에 _malloc_dbg(...)를 사용하면 정확한 위치를 알 수 있습니다.

참고2)
위 보고에서 {45}, {47}이 등장하는데,
프로그램 시작부분에 _CrtSetBreakAlloc(45)와 같이 해당 값을 넣고 F5를 누르면,
Leak이 발생하는 부분에서 자동으로 break가 걸립니다.
new/delete가 막 섞여 있는 곳에서는, {45}와 같은 id가 항상 바뀌기 때문에, 정확한 위치를 찾기 힘들지만,
정적으로 항상 같은 id가 나오는 경우에는 정확하게 leak이 발생하는 위치를 찾을 수 있습니다.
Bounds Checker 부럽지 않죠?



'프로그래밍 > Win32' 카테고리의 다른 글

Full Design CMainFrame의 구현  (0) 2010.07.20
Vista에서 Crash Dump 파일 만들기  (0) 2009.10.06
.exe에 Manifest 추가  (0) 2009.09.22
MAX_PATH가 넘어가는 Path 생성하기  (0) 2009.09.14
GetShortPathName(...)의 함정  (0) 2009.09.14