1. 程式人生 > >VS除錯記憶體洩露

VS除錯記憶體洩露

注意,如果發生洩漏的 cpp 檔案中如果沒有新增以下程式碼,則可能無法正常跳轉:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

最常見的情況
如: MFC 可能報告 Strcore.cpp 檔案的某行有記憶體洩漏, 但實際上這是 CString 的實現函式, 本身並不會造成
記憶體洩漏,由於使用它的程式碼並沒有正確釋放包含了 CString 物件的記憶體塊,導致 CString 內部動態分配的快取空
間得不到釋放引起洩漏, 此時並不能直觀的知道發生了記憶體洩漏的真實位置, 這時我們就需要更多的資訊來輔助
定位發生洩漏的實際位置。那麼我們看看緊接其後的:
{86}normalblockat0x00422E80,10byteslong.
Data:<>1F1F1F1F1FCDCDCDCDCD


它告訴我們:在第 86 次分配的記憶體沒有釋放,一共有 10 位元組,內容移 16 進位制方式列印給我們看。有了
這些資訊,我們可以開始除錯記憶體洩漏了

在程式開始的地方下斷點,再在watch視窗name中輸入
在 VS2005 中常寫為:
{,msvcrt80d.dll}_crtBreakAlloc
VS2013 中寫為:(注意是 vcr 而不是 vcrt)
{,msvcr120d.dll}_crtBreakAlloc
其它版本的類似。

在watch視窗中的value中輸入記憶體塊號,再按F5即可定位到洩露之處