2015. 7. 2. 15:37ㆍIT-개발/winapi 및 MFC
C 또는 C++ 프로그램을 작성하다보면, 본인도 모르는 사이 메모리 누수가 발생한다. 그리고, 이
문제가 발생하는 코드를 찾고, 해결하는 것은 프로그램 실력이 부족한 본인과 같은 사람들에게는 쉽지 않은 일이다. 그래서, 이 글에서는 C++에서
메모리 누수의 발생여부를 확인하고 디버깅하는 방법을 정리해 보고자 한다.
- 메모리 누수 체크
일단 해당 프로그램의 main 함수가 있는 'cpp' 파일에 아래와 같은 부분을 추가한다.
#include <crtdbg.h>
#ifdef _DEBUG
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__ )
#endif그리고, main 함수 내부에 다음과 같은 코드를 삽입한다.
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
위의 코드들을 모드 삽입한 후에 DEBUG 모드로 프로그램을 실행시키면 다음과 같은 두가지 결과 중 하나를 볼 수 있다.
1) 메모리 누수가 발생한 파일과 line을 알려주는 경우.
Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.2) 메모리 누수가 발생한 파일이나 위치를 알려주지 않는 경우.
Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
결과 1)과 결과 2) 모두 64 byte의 메모리 누수가 발생했음을 알 수 있다. 결과 1)의 경우는 알려주는 위치에 해당하는 메모리를 잘 따라가서 해지해주면 쉽게 해결된다. 하지만, 결과 2)의 경우는 한가지 과정을 더 거쳐야 메모리 누수가 발생하는 위치를 알 수 있다. - 메모리 누수 디버깅
앞서 언급했듯이 결과 1)의 경우는 쉽게 문제 해결이 가능하다. 그렇다고 결과 2)가 나왔다고 좌절할 필요는 없다. ^^
결과 화면내 중괄호{ } 내부에 있는 숫자( 결과 2)에서는 '18' )를 이용해서 메모리 누수가 발생하는 위치를 알 수 있다.
main 함수내에 아래의 코드를 넣어준다.
_crtBreakAlloc = 18 // 18은 결과 2)의 중괄호 내의 숫자 위의 코드를 삽입한 후 DEBUG 모드로 프로그램을 실행시키면, 메모리 누수가 발생하는 지점에서 프로그램이 멈춘다. 그 위치에 해당하는 변수의 메모리를 잘 해지해주면 문제는 해결된다. ^^
모든 프로그램이 메모리 누수없이 잘 동작했으면 좋겠지만, 사실 규모가 큰 프로그램을 작성 하다보면 그 것이 말처럼 쉽지 않다. 본인은 이 문제 때문에 매우 고생했지만, 이 글을 읽는 독자들은 그런 고생을 하지 않길 바랍니다. ^^
'IT-개발 > winapi 및 MFC' 카테고리의 다른 글
CreateEvent 분석...(펌) (0) | 2015.08.11 |
---|---|
Microsoft.Windows.Common-Controls 6.0 Style (0) | 2015.07.23 |
메모리누수 - 대응법(1) (2) | 2015.07.02 |
"Warning: Calling DestroyWindow in CWnd::~CWnd" 처리하기(펌) (0) | 2015.07.02 |
CListCtrl 의 정렬 기능~ (0) | 2015.06.16 |