Visual C++ Detected memory leaks debugging

'Detected memory leaks!' 즉 메모리가 누수시 AfxSetAllocStop(number) 이용하면 쉽게 디버깅이 가능하다.
만약 출력창에 다음과 같이 메모리 누수가 나타나면
Dumping objects ->
{1359} normal block at 0x0139D7D8, 332 bytes long.
 Data: <                > 00 00 00 00 CD CD CD CD 00 00 00 00 00 00 00 00 
{1358} normal block at 0x0139D758, 64 bytes long.
 Data: <d:\Project\OCR-N> 64 3A 5C 50 72 6F 6A 65 63 74 5C 4F 43 52 2D 4E 

소스 코드 시작지점(main, init. 생성자....등)에서 {} 안에 있는 숫자를 파라미터로 설정하여 다음과 같이 사용한다.
AfxSetAllocStop(1359);

그리고 나서 F5 로 디버깅을 시작하면 메모리를 공간을 확보하는 시점(new, alloc()...)에 브레이크포인트가 걸린다.
이후 호출스택을 보면 어느시점에서 어떤 녀석이 메모리를 사용하려고 하는지 알수 있다.
결국 그 어떤 녀석이 나중에 메모리 해제가 안되는 것으로 파악되고 코드를 수정하면 된다.
AfxSetAllocStop 는 MFC 환경에서 사용되는 함수이다. 만약 MFC 환경이 아니라면 다음과 같이 _CrtSetBreakAlloc() 를 사용한다.
void main()
{
#if defined(WIN32) || defined(WIN64)
#ifdef _DEBUG
#include <crtdbg.h>
 // _CRTDBG_ALLOC_MEM_DF ==> _CLIENT_BLOCK 에 메모리를 할당에 대해서 덤프
 // _CRTDBG_LEAK_CHECK_DF ==> 프로그램이 종료될 때 자동으로 _CrtDumpMemoryLeaks() 를 호출하여 메모리 누수시 덤프
 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
 // 해제 안되는 new 의 파일과 라인수를 파악한다.
 #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)

 // 메모리 누수시 블록숫자값(출력창의{1234})을 주면 메모리 공간을 확보하는 시점에 브레이크포인트가 걸린다.
 _CrtSetBreakAlloc(1359);
#endif
#endif
}

comments:

댓글 쓰기