當調試情況下運行程式時,在輸出視窗的Debug 標籤處_CrtDumpMemoryLeaks表現出記憶體流失的資訊。記憶體流失資訊類似下面這樣:
Detected memory leaks!
Dumping objects ->
C:/PROGRAM FILES/VISUAL STUDIO/MyProjects/leaktest/leaktest.cpp(20) : {18} normal block at
0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
如果你沒有用#define _CRTDBG_MAP_ALLOC說明,記憶體漏洞堆存處類似下面這樣:
Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
在記憶體配置數目處設定一個斷點
在記憶體流失報告中的檔案名稱和行號可告訴你泄漏的記憶體在那裡被分配,但是瞭解記憶體在那裡分配對於評鑑問題不總是充分的。在一個程式運行過程中,經常是一個分配將會被調用很多次,但是它可能在某次調用中泄漏記憶體。為了確定問題,你必須不但知道泄漏的記憶體在那裡分配,還要知道泄漏發生的條件。對你來說,使它成為可能的那條資訊是記憶體配置號。當那些被顯示的時候,檔案名稱和行號之後,這是在curly brace中出現的數值。例如,在下面的輸出中,"18"是記憶體配置號。它的意思是泄漏的記憶體是你程式中記憶體配置的第十八個模組。
Detected memory leaks!
Dumping objects ->
C:/PROGRAM FILES/VISUAL STUDIO/MyProjects/leaktest/leaktest.cpp(20) : {18} normal block at
0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
此函數列印出類似於下面這樣的一堆記憶體配置資訊:
0 bytes in 0 Free Blocks.
0 bytes in 0 Normal Blocks.
3071 bytes in 16 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 3071 bytes.
Total allocations: 3764 bytes.
為了確定一個記憶體流失是否在一節代碼中出現,你可以在此節前和此節後對記憶體狀態作快照,然後用_CrtMemDifference比較兩種狀態:
_CrtMemCheckpoint( &s1 );
// memory allocations take place here
_CrtMemCheckpoint( &s2 );
if ( _CrtMemDifference( &s3, &s1, &s2) )
_CrtMemDumpStatistics( &s3 );