【正文】
下: Detected memory leaks! Dumping objects {18} normal block at 0x00780E80, 64 bytes long. Data: CD CD CD CD CD CD CD CD CD CD Object dump plete. Detected memory leaks! Dumping objects C:\leaktest\(20) : {18} normal block at 0x00780E80, 64 bytes long. Data: CD CD CD CD CD CD CD CD CD CD CD CD Object dump plete. 2. 應(yīng)用程序定義了 _CRTDBG_MAP_ALLOC,報(bào)告輸出如下: _CRTDBG_MAP_ALLOC 可以在報(bào)告中顯示泄漏在 文件中發(fā)生的位置 內(nèi)存泄漏檢測(cè)工具 ?MS CRuntime Library內(nèi)建的檢測(cè)功能 ? 內(nèi)存泄漏報(bào)告分析 21 Detected memory leaks! Dumping objects C:\leaktest\(20) : {18} normal block at 0x00780E80, 64 bytes long. Data: CD CD CD CD CD CD CD CD CD CD CD CD Object dump plete. 泄漏內(nèi)存 的分配號(hào) 泄漏內(nèi)塊 的類(lèi)型 泄漏內(nèi)存 的地址 泄漏內(nèi)存 的大小 泄漏內(nèi)存前 16 字節(jié)的內(nèi)容 泄漏內(nèi)存發(fā) 生的位置 內(nèi)存泄漏檢測(cè)工具 22 ?MS CRuntime Library內(nèi)建的檢測(cè)功能 ? C++使用 crt調(diào)試堆函數(shù),需要添加如下代碼 ifdef _DEBUG ifndef DBG_NEW define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ ) define new DBG_NEW endif endif 注意:丌要將上述代碼添加在 stl庫(kù)的頭文件前面,否則編譯丌通過(guò)! 內(nèi)存泄漏檢測(cè)工具 ?IBM Rational Purify ?使用 Object Code Insertion技術(shù),無(wú)需修改源代碼,只需目標(biāo)程序及其調(diào)試符合 PDB文件即可。 ?Purify工作流程 23 內(nèi)存泄漏檢測(cè)工具 ?IBM Rational Purify ?Purify的使用 24 1. 加載程序 內(nèi)存泄漏檢測(cè)工具 25 2. 分析報(bào)告 內(nèi)存泄漏檢測(cè)工具 ?IBM Rational Purify ? 丌足乊處 26 1. 跑大型復(fù)雜程序比較費(fèi)勁,對(duì)服務(wù)器環(huán)境要求較高,有時(shí)程序無(wú)法啟勱 1. 丌是免費(fèi)的,破解版穩(wěn)定性較差 內(nèi)存泄漏防范 ?內(nèi)存泄露防范幾點(diǎn)建議 27 建議 1:少使用 new,除非必須使用。 建議 2:使用智能指針。 建議 3:如果一個(gè)接口的實(shí)現(xiàn)中有分配內(nèi)存動(dòng)作,必須有一 個(gè)對(duì)應(yīng)的釋放接口。 建議 4:復(fù)雜邏輯的代碼段最好使用結(jié)對(duì)編程。 建議 5:版本構(gòu)建前,使用 CRuntime Library堆調(diào)試加強(qiáng) 單元測(cè)試 。 28 討論 你有什么更好的經(jīng)驗(yàn), 說(shuō)出來(lái)大家一起分享下!