1. 啟用內存泄漏檢測#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
當退出程序位置固定時,用:
_CrtDumpMemoryLeaks();
定義了_CRTDBG_MAP_ALLOC 時,會顯示內存塊類型和內存塊分配編號(在大括號內)。
當退出位置不固定時,用:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
該語句在程序退出時自動調用 _CrtDumpMemoryLeaks。必須同時設置 _CRTDBG_ALLOC_MEM_DF 和 _CRTDBG_ALLOC_MEM_DF 兩個位域。
2. 內存塊類型“普通塊”是由程序分配的普通內存。
“客戶端塊”是由 MFC 程序用于需要析構函數的對象的特殊類型內存塊。MFC new 操作根據創建對象的需要創建普通塊或客戶端塊。
“CRT 塊”是由 CRT 庫為自己使用而分配的內存塊。CRT 庫處理這些塊的釋放,因此您不大可能在內存泄漏報告中看到這些塊,除非出現嚴重錯誤(例如 CRT 庫損壞)。
3. 內存泄露定位 - 在內存分配編號上設置斷點先通過_CrtDumpMemoryLeaks查到泄露的內存塊分配號n,然后添加語句
_CrtSetBreakAlloc(n);
Debug程序運行后,將自動斷點至分配處
4. 內存狀態比較_CrtMemCheckpoint( &s1 );
// memory allocations take place here
_CrtMemCheckpoint( &s2 );
if ( _CrtMemDifference( &s3, &s1, &s2) )
_CrtMemDumpStatistics( &s3 );
5. CRT內存泄露誤報在某些情況下,_CrtDumpMemoryLeaks 可能給出錯誤的內存泄漏指示。如果使用將內部分配標記為 _NORMAL_BLOCK 而不是 _CRT_BLOCK 或 _CLIENT_BLOCK 的庫,則可能發生這種情況。其結果是,_CrtDumpMemoryLeaks 無法區分用戶分配和內部庫分配。如果庫分配的全局析構函數在您調用 _CrtDumpMemoryLeaks 的位置之后運行,則每個內部庫分配都被作為內存泄漏進行報告。Visual Studio .NET 之前的早期版本的標準模板庫會導致 _CrtDumpMemoryLeaks 報告這樣的錯誤指示,但在最新版本中此問題已經得到解決。
posted on 2008-05-10 04:40
w2001 閱讀(696)
評論(0) 編輯 收藏 引用 所屬分類:
C/C++語言