메모리릭이 발생하면 디버거를 종료했을 때 이런 메시지가 출력된다.
Detected memory leaks!
Dumping objects ->
{103144} normal block at 0x01C79B18, 12 bytes long.
Data: < > 18 9B C7 01 18 9B C7 01 CD CD CD CD
왠 만하면 어느 파일의 몇 번째 줄에서 메모리릭이 발생했다고 알려주지만, 이 경우처럼 디버거가 알려주지 못하는 경우도 많고, for문 안에서 메모리릭이 발생하는 경우처럼 위치만 알아서는 정확히 언제 발생하는지 알기 어려울 때도 있다. 이럴 때 사용할 수 있는 것이 중괄호안에 들어있는 숫자다. 이 숫자는 메모리 할당 번호(Memory Allocation Number)인데, 번호가 103144라는 것은 이 프로그램에서 할당받은 메모리 중에서 103144번째 블록이라는 뜻이다(헉... 내 프로그램이 메모리를 이렇게 많이 할당받았던가 -0-;;).
프로그램 코드의 적당한 위치에
_crtBreakAlloc = 103144;
라 고 적어주고 디버거를 실행하면 이 메모리를 할당하려고 할 때 프로그램을 Break 시켜준다. 디버그 버전에서는 힙에 메모리를 할당할 때마다 crtdbg 라이브러리(이렇게 표현해도 되나?)가 이 변수를 체크해서 Break 해주는 것이다. 디버깅중에 Watch 윈도우에서 변수 값을 바꿔서 다른 메모리 할당 번호에서 멈출 수도 있다. 전역 변수 값을 변경하는 대신에
_CrtSetBreakAlloc(103144);
라고 함수를 호출해주어도 마찬가지 효과가 있다.
MSDN 기술문서 중 "Detecting and Isolating Memory Leaks"를 참고했음.
//------------------------------------------------------------------------------------
사용 방법 설명
Detected memory leaks!
Dumping objects ->
{103144} normal block at 0x01C79B18, 12 bytes long.
Data: < > 18 9B C7 01 18 9B C7 01 CD CD CD CD
추가 헤더 파일 : #include <crtdbg.h>
[MFC]
~App::InitInstance() 함수 상위에 아래와 같이 문제가 발생된 메모리 블럭 설정
{
...
_CrtSetBreakAlloc(103144);
_CrtMemDumpAllObjectsSince(0);
}
[Win32/Console]
main()
{
...
_CrtSetBreakAlloc(
103144);
_CrtMemDumpAllObjectsSince(0);
}