window 下内存泄漏检测
?? 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 。
總結
以上是生活随笔為你收集整理的window 下内存泄漏检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp.net menu Operati
- 下一篇: Hibernate代码生成工具 设计全攻