CMemoryState(MFC記憶體檢測類)

2021-09-24 13:04:02 字數 1032 閱讀 2757

mfc中的cmemorystate 類。

這個類非常有用,它可以給當前記憶體照個快照,並可以將記憶體快照進行比對。如果你想確認程式在某個時段中分配的記憶體全部被正確的釋放,那可以在這個時段開始時照個快照,結束後再照乙個。如果這個兩個快照不一樣,說明這個時段中有記憶體洩漏了。

這個類很容易使用。msdn上的說明很清楚,還有乙個例子。

emule在emule.cpp檔案中申明了這個類的三個靜態變數

static cmemorystate oldmemstate, newmemstate, diffmemstate;

oldmemstate.checkpoint();

在該方法快結束時雙照了乙個並進行了比較,如果不一樣,就說明有記憶體洩漏了。把****存情況匯出到output視窗。

newmemstate.checkpoint();

if (diffmemstate.difference(oldmemstate, newmemstate))

一般可以用_debug巨集控制讓這些**只在除錯階段被編譯。

雖然這個類是mfc中的,其實是包裝了run-time中幾個debug方法,但用起來很方便。如果不想用mfc,也可以直接把這個類摳出來用就是了。我就是這麼幹的,因為我都是用wtl。

值得注意的是,快照的時機要掐準。最好是在剛開始就在關鍵部位掐好,每加入一點新功能就跑一跑。這種方式可以在程式一出現記憶體洩漏時就讓你知道。在晚期再加這個機制就沒什麼用了,因為它並不能分析和定位記憶體洩漏。

有一種情況要注意一下。如果掐的時機不准,很容易誤報。比如我在main函式的開始和結尾掐快照,直覺上覺得應該是沒問題了。但是如果程式中有乙個全域性物件,那麼它會在main()之前被構造。假如這個物件有乙個成員變數是乙個stl::string,構造時為空,但在程式執行中給它賦了值。這時 string內部會new記憶體塊出來。同樣這個物件會在main()之後被析構,這時string內部new出來的記憶體才會被delete,但這已經超來了第二個快照的範圍。這時兩個快照是不一致的,但其實沒有記憶體洩漏。

讀後感:

cmemorystate 類應該是對「c 執行時庫檢測記憶體洩漏」的封裝

記憶體洩露檢測

c 中檢測記憶體洩漏可以引入系統定義的巨集來檢視,內存在哪個位置洩漏 檔案開始處加入下列定義 define crtdbg map alloc include include 程式退出時加入以下函式 crtdumpmemoryleaks 如果有洩漏會顯示 記憶體洩漏是程式設計中常常見到的乙個問題,我所...

檢測記憶體洩露

程式結束時,作業系統會 程式占用的資源.但是,只要程式還在執行,如果不進行清理,資源最終可能被耗盡.1.vc記憶體洩露檢查工具 visual leak detector 現在已知的最新有2.0版本的,使方法不詳。使用 visual leak detector 2.2.3 在vs工程的linker i...

記憶體洩露檢測

1 包含標頭檔案 include include 2 每個cpp檔案包含 static char this file file define new new normal block,this file,line 3 設定標誌 int tmpdbgflag tmpdbgflag crtsetdbgf...