標籤:記憶體泄露 visual studio c++
使用簡介 在寫程式的過程中,難免會遇到記憶體泄露的時候,這個時候如果手工尋找記憶體泄露,不說方法沒有通用的,就是真的要自己手工尋找也是很耗時間和精力的。誠然,我們可以藉助一些工具,而且我們還會驚奇地發現這些工具很有用(比如Intel的記憶體泄露偵查工具),但是因為往往這些工具安裝比較麻煩,而我們寫的程式又不是很大,所以我們或許可以找個更小巧的方法。微軟就提供了這樣的方法,我們只需要在程式中加入幾行代碼,就可以發現記憶體泄露的問題,然後我們就可以定位記憶體泄露了(自己用幾行代碼就可以實現,神奇!)。那麼如何?了,主要的幾個函數現先列舉一下:_CrtDumpMemoryLeaks,_CrtMemCheckpoint,_CrtMemDifference
- CrtDumpMemoryLeaks :當前所有沒有銷毀的對象(沒有delete和free),預設情況下輸出到調試視窗
- _CrtMemCheckpoint:儲存當前所有沒有銷毀的對象的狀態
- _CrtMemDifference:比較兩個_CrtMemCheckpoint儲存的狀態,返回差異值
簡單的使用_CrtDumpMemoryLeaks可以檢測當前沒有釋放的對象,但是如果程式大一點,需要確定某一段程式是否有問題時,就需要後面的兩個參數了。_CrtMemCheckpoint儲存的是_CrtDumpMemoryLeaks的結果,如果我們在一段程式的前後分別儲存一個狀態,那麼通過比較這兩個狀態我們就可以獲知這一段程式是否有記憶體泄露的問題了。
使用樣本
使用這些語句啟用調試堆函數之後,可以在某個應用程式退出點之前設定一個對 _CrtDumpMemoryLeaks 的調用,以便在應用程式退出時顯示記憶體流失報告:
_CrtDumpMemoryLeaks();
如果要為程式添加退出點時檢測記憶體泄露,則可以通過設定調試選項來設定,而不需要在每個退出點自己添加函數_CrtDumpMemoryLeaks的調用:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
預設情況下,輸出的調試資訊會在調試視窗,當然,你可以通過_CrtSetReportMode來自訂輸出位置。
定位記憶體流失的另一種技術涉及在關鍵點對應用程式的記憶體狀態拍快照。 若要為應用程式中給定點的記憶體狀態拍快照,建立 _CrtMemState 結構,將它傳遞給 _CrtMemCheckpoint 函數:
_CrtMemState s1;_CrtMemCheckpoint( &s1 );
_CrtMemCheckpoint 會將當前記憶體狀態填充在該結構中。
如果要查看輸出 _CrtMemState 結構的內容,可使用_ CrtMemDumpStatistics 函數:
_CrtMemDumpStatistics( &s1 );//_ CrtMemDumpStatistics 輸出記憶體狀態轉儲,如下所示:// 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 );}
_CrtMemDifference比較記憶體狀態 s1 和 s2,在 (s3) 中返回結果,即 s1 與 s2 的差異。
尋找記憶體流失的一個方法是,首先在應用程式的開頭和結尾部分放置 _CrtMemCheckpoint 調用,然後使用 _CrtMemDifference 比較兩個結果。 如果 _CrtMemDifference 顯示有記憶體流失,通過添加更多 _CrtMemCheckpoint 調用來使用二進位搜尋劃分程式,直至找到泄漏源。