디버그 환경에서 재현되는 메모리 릭의 경우 가장 편리하게 디버깅하는 방법은 CRT Debug 함수를 사용하는 것입니다.
_CrtSetDbgFlag() API를 사용하면 VS에서 Debug 실행 종료시 DebugString으로 Leak 내용이 출력됩니다. (MFC의 경우 디폴트로 세팅됨)
코드 시작부분에 다음과 같이 선언해주면 함수 종료시 메모리 릭 여부를 체크하여 릭이 있을 경우 아래과 같이 DebugString으로 출력해 줍니다.


Detected memory leaks!

Dumping objects ->
c:\program files\microsoft visual studio 8\vc\include\crtdbg.h(1150) : {50} normal block at 0x003A2F50, 100 bytes long.
Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
The program '[3868] MemoryLeakTest.exe: Native' has exited with code 0 (0x0).

메시지 중 "{50}"이라는 숫자가 있는데 MSDN에서는 이걸 "Allocation order number"라고 소개하고 있습니다. 말하자면, 50번째로 할당된 메모리에서 Leak이 발생했다는 의미이죠.

이때  _CrtSetBreakAlloc() 함수에 저 번호를 넘겨주면 해당 메모리가 할당된 지점에서 BreakPoint가 걸립니다.




이제 VisualStudio의 CallStack 창에서 해당 메모리가 어디서 할당되었는지 확인만 하시면 되시겠습니다.
단, 위의 함수들은 Debug Only!! ^^ 만약 릴리즈환경에서 오랫동안 실행되어야 확인되는 오류라면 LeakDiag 등 메모리누수 탐지 도구를 사용해야 합니다. 또, 멀티스레드라던가 해서 여러번 실행했을 때 메모리 할당순서가 매번 바뀌는 경우라면 이 방법(CRT Debug함수)은 소용 없을 듯 합니다. 메모리가 할당된 번호를 기준으로 BP를 거니까요..

자세한 내용은 여기에...
http://again4you.egloos.com/1350482

아래 글에서는 CRT 디버그함수를 이용해 메모리누수 뿐만 아니라 delete된 메모리를 재사용하는 오류, 배열의 경계를 침범하는 오류 등을 체크하는 방법도 소개되어 있네요. ^^
http://challengeok.tistory.com/entry/%ED%8E%8C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98-%EB%94%94%EB%B2%84%EA%B9%85
(가급적이면 원본 글을 찾아서 링크하려고 했는데... 원본은 없어진 것 같고 퍼온글들만 10여건이 검색되네요. ^^;;)

좋은 내용 공유해주신 again4you 님과 gazette2 님께 감사! ^^

Posted by kuaaan
,


사랑합니다. 편안히 잠드소서