首先,應該是MFC報告我們發現記憶體洩漏。注意:要多運作幾次,以确定輸出的内容不變,特别是{}之間的數值,不能變,否則下面的方法就不好用了。

我們來看看:
F:/CodeSample/Test/TestPipe/LeakTest/MainFrm.cpp( 54 ) : { 86 } normal block at 0x00422E80 , 10 bytes long .
Data: < > 1F 1F 1F 1F 1F CD CD CD CD CD
F:/CodeSample/Test/TestPipe/LeakTest/MainFrm.cpp( 54 ) 告訴我們MFC認為是在該檔案的54行,發生了記憶體洩漏。你輕按兩下改行就可以轉到該檔案的54行了。但是有時候這一資訊并不能用來準确判斷,比如:MFC可 能報告Strcore.cpp檔案的某行,實際上這是CString的實作函數,此時并不知道什麼時候發生了記憶體洩漏。
此時我們需要更多的資訊。那麼我們看看緊接其後的:
{ 86 } normal block at 0x00422E80 , 10 bytes long .
它告訴我們:在第86次配置設定的記憶體沒有釋放,一共有10位元組,内容移16進制方式列印給我們看。
有了這些資訊,我們可以開始調試記憶體洩漏了。
按下F10在程式的剛開始處,停下來,打開Watch視窗:
在Watch視窗中輸入:
{,,msvcrtd.dll}_crtBreakAlloc
然後更改值為上文提到的配置設定次數:86
接着按下F5繼續,然後在第86次配置設定的時候會發生中斷:
然後我們打開堆棧視窗:
往回檢視最近我們自己的代碼,輕按兩下堆棧我們自己的函數那一層,上圖有綠色三角的那一層。就定位到洩漏時配置設定的記憶體了。
From: http://www.cnitblog.com/Raistlin/archive/2005/12/14/5380.html
靜态:_crtBreakAlloc
動态:{,,msvcr40d.dll}*__p__crtBreakAlloc() (vc++4.0 和4.1版本,估計沒人在用吧)
{,,msvcrtd.dll}*__p__crtBreakAlloc() (Visual C++ 4.2 or later)
{,,msvcrtd.dll}_crtBreakAlloc (好像這樣也是可以的)
{,,msvcrtd.dll}__p__crtBreakAlloc()是個什麼東西呢?
檢視msdn索引“Advanced Breakpoint”and you will find out...
文法如下:
{[function],[source],[exe] } location
{[function],[source],[exe] } variable_name
{[function],[source],[exe] } expression