본문 바로가기
C++ 200제/코딩 IT 정보

VC++ MFC 디버그 에러와 메모리 누수 해결 프로그래밍 팁 3개

by vicddory 2018. 7. 14.

VC++ MFC 디버그 에러와 메모리 누수 해결 프로그래밍 팁 3개


VC++에서 스레드를 사용하는 프로그램. 디버그 시 OS가 멈추는 현상 (디버그 에러)


XP에서 스레드를 사용하는 프로그램을 디버깅하다 보면 자주 OS가 멈춰버려서 리부팅까지 해야 하는 상황이 자주 발생합니다. 이 때문에 98이나 2000 에서 디버깅하기도 했는데 VC++ 6.0과 XP가 충돌하는 것으로도 의심했었지만 VC++2005 에서도 같은 문제가 생긴다고 합니다.


그래서 검색을 해보니 원인은 IME 쪽 버그라고 합니다. 그래서 디버그 에러도 발생하는 것이죠.


1. 제어판 --> 국가 및 언어 옵션 --> 언어 탭 --> 자세히...

2. --> 고급 --> 고급 텍스트 서비스 사용 안 함 - 체크 후 리부팅


VC++ 프로그래밍 팁[VC++ 프로그래밍 팁, 디버그 에러와 메모리 누수]


VC++의 메모리 누수 (Memory Leak) 탐지 기능 사용하기


보통 디버깅을 하다 보면 메모리 릭이 발생했다는 메시지가 출력되지만, 어디에서 현상이 발생했는지는 표시해 주지 않습니다. 다른 유틸리티를 사용해 보기도 했지만, 가끔 프로그램에 충돌이 생겨 디버깅할 수 없었습니다.


이런 경우에 VC++에 내장된 메모리 누수 탐지 기능을 사용해서 현상이 발생한 소스 파일의 위치를 표시하도록 할 수 있습니다. 원리는 new 나 malloc 등의 함수를 새로 정의해 메모리를 할당할 때 소스 파일의 위치를 기억해 두었다가 프로그램 종료 시 해제되지 않은 메모리의 위치를 표시하도록 하는 것입니다.


소스 파일명을 나타내는 마크로 __FILE__와 라인 번호를 나타내는 마크로 __LINE__ 가 사용됩니다.

(1) MFC를 사용하는 경우


먼저 stdafx.h 파일에서 다른 include 문 보다 제일 상위에 다음 선언문을 추가합니다.


1
2
3
4
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC // include Microsoft memory leak detection procedures
#define _INC_MALLOC      // exclude standard memory alloc procedures
#endif
cs


_CRTDBG_MAP_ALLOC 은 crtdbg.h 파일에서 new 등을 새로 정의하도록 사용됩니다.


그리고 VC++ 프로그램 초기에 아래 함수를 추가합니다.


1
2
3
#ifdef _DEBUG
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
#endif
cs


stdafx.h 파일을 사용하지 않는 소스 파일의 경우 (Pre compiled header 기능을 사용하지 않는 경우)는 기존 메모리 할당 함수를 사용하게 되므로 이 기능이 지원되지 않게 됩니다.


만일 stdlib.h 파일에서 컴파일 에러가 발생하는 경우는 다음을 시도해 봅니다.


1
2
3
4
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC // include Microsoft memory leak detection procedures
#define _INC_MALLOC     // exclude standard memory alloc procedures
#endif
cs


(2) MFC를 사용하지 않는 경우


crtdbg.h 파일이 자동으로 추가되지 않으므로 소스 파일에 crtdbg.h 를 추가해야 합니다.


1
2
3
4
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include [crtdbg.h] <-- 수정 필요 :-)
#endif
cs


마찬가지로 VC++ 프로그램 초기에 아래 함수를 추가합니다.


1
2
3
#ifdef _DEBUG
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
#endif
cs


VC++ 디버그 에러 메모리 누수[VC++ 프로그래밍 팁, 디버그 에러와 메모리 누수]


(3) 링크에러가 발생하는 경우


1
2
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)"
 (??2@YAPAXI@Z) already defined in StdAfx.obj
cs


위와 같은 링크 에러가 발생하게 되면 임시방편으로 아래와 같이 강제로 링크하도록 합니다.


Project Settings --> Link --> Customize --> Force file output 항목 체크


이는 Project options에 /FORCE 플래그를 추가하는 것과 같습니다.


다른 링크 에러의 경우는 아래 사이트를 참조합니다.



출처 - 모르면 고생하는 VC++ 팁 [링크]

VC++ MFC 디버그 에러와 메모리 누수 해결 프로그래밍 팁 3개