다음 코드를 수행하면 pure virtual function call 에러가 발생되면서 프로그램이 죽는다.
class A
{
public:
A() {
}
void intermediate_call() {
// Bad: virtual function call during object destruction
virtual_function();
}
virtual void virtual_function() = 0;
virtual ~A() {
intermediate_call();
}
};
class B : public A
{
public:
// override virtual function in A
void virtual_function()
{
printf("B::virtual_function called\n");
}
};
B myObject;
// This call behaves like a normal virtual function call.
// Print statement shows it invokes B::virtual_function.
myObject.virtual_function();
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"를 참고했음.