在window 下開發進行記憶體流失的檢測相對比較容易。 這裡只是簡單的記錄一些東西,沒有具體的談論實現。 window 下面記憶體檢測主要可以考慮從兩個方面入手,這兩個方面並不是一個if else 分支。
1、如果你在MS 的開發環境下,(其他的開發環境不是很熟悉),可以使用MS 內部定義的調試庫,使用他們是比較簡單的,下面就簡單的寫一個例子:
#include <crtdbg.h>
int main() { char *pString = new char[8] ; _CrtDumpMemoryLeaks(); return 0; }
通過上面的例子,就就知道了如何使用這些調試庫,首先是保護這個調試庫的標頭檔,具體調試庫提供了那些api,可以到.h檔案中看看, Dump Meory Lead 只是其中的一個而已。要注意的事情是這些函數只能使用在debug 版本的程式中。 另外一個比較實用的例子就是通過設定記憶體狀態檢測點來比較記憶體的變化,從而排查出記憶體流失的地方。 涉及到的三個api 函數是: 設定記憶體狀態檢測點:_CrtMemCheckPoint(&memstate); 比較記憶體狀態檢測點之間的差異:_CrtMemDifference (&memstate_difference , & memstate_original, & memstate_now ) ; 顯示記憶體狀態的差異:_CrtDumpAllObjectsSince(&memstate_defference); 具體使用可以看看msdn 。
2、另外實現的方法就是自己重載new、delete、malloc、free 等記憶體配置和釋放的函數,通過設定一個list 來記錄記憶體分保的情況。 可以通過這樣的架構來實現這個公用: A 、#define new DEBUG_NEW
B、#define DEBUG_NEW(nSize) NewFunc((nSize),THIS_FILE, __LINE__) //或者通過重載new 的方法來實現
C、void * NewFunc(size_t size , const char *pFileName , int nLine)
{
// Lock list
//Allocate memory
//Add the memroy object to the list
//Unlock list
return memory ;
}
D 、Free 的實作類別似。
這樣的話,在程式推出的時候,就可以dump 出說有分配了但是沒有釋放的記憶體。 多數自己實現防止記憶體流失的方法都是這樣的。
MS 在MFC 還提供了一個類 CMemoryState 和一些API , AfxCheckMemory,AfxDumpMemoryLeaks .... 都是很方法的方法。
MS 推薦的檢測記憶體流失的方法的是這樣的:
1、跟蹤記憶體配置的情況,使用DEBUG_NEW 來代替new 完成記憶體分保的操作, 在很多MFC 的項目中,在.cpp 檔案中可以看到很多 define new DEBUG_NEW ,就是為了這個目的。
2、允許記憶體診斷,可以通過 AfxEnableMemoryTracking 函數來設定允許記憶體診斷,如果不使用MFC 的項目中,可以直接通過函數 _CrtSetDbgFlag 來設定 _CRTDBG_ALLOC_MEM_DF 標識。具體可以看看這個函數的source code。 設定之後你就可以使用 AfxCheckMemory 之內的api 來進行記憶體檢測了。 其實這個函數也是直接調用了_CrtCheckMemory 函數,這樣在不是MFC 的環境,就可以直接調用 _CrtCheckMemory 函數。
3、對記憶體做快照,通過比較記憶體快照的變化來找出記憶體流失的地方。這個就是上面說的方法。
4、查考記憶體的統計資料,可以通過CMemoryState::DumpStatistics 來完成,具體可以看看CmemoryState 這個類的用法。
5、Object Dump ,這個是通過 CMeoryState ::DumpAllObjectsSince
來完成對象的dump 。