1、什麼是內存泄露?html
在計算機科學中,內存泄漏指因爲疏忽或錯誤形成程序未能釋放已經再也不使用的內存的狀況。內存泄漏並不是指內存在物理上的消失,而是應用程序分配某段內存後,因爲設計錯誤,失去了對該段內存的控制,於是形成了內存的浪費。c++
一般咱們所說的內存泄漏是指堆內存的泄漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小能夠在程序運行期決定),使用完後必須顯示釋放的內存。應用程序通常使用malloc,realloc,new等函數從堆中分配到一塊內存,使用完後,程序必須負責相應的調用free或delete釋放該內存塊,不然,這塊內存就不能被再次使用,咱們就說這塊內存泄漏了。git
二.內存泄露的分類github
(1)常發性內存泄漏:發生內存泄漏的代碼會被屢次執行到,每次被執行的時候都會致使一塊內存泄漏。
(2)偶發性內存泄漏:發生內存泄漏的代碼只有在某些特定環境或操做過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。因此測試環境和測試方法對檢測內存泄漏相當重要。
(3)一次性內存泄漏:發生內存泄漏的代碼只會被執行一次,或者因爲算法上的缺陷,致使總會有一塊僅且一塊內存發生泄漏。好比,在一個Singleton類的構造函數中分配內存,在析構函數中卻沒有釋放該內存。而Singleton類只存在一個實例,因此內存泄漏只會發生一次。
(4)隱式內存泄漏:程序在運行過程當中不停的分配內存,可是直到結束的時候才釋放內存。嚴格的說這裏並無發生內存泄漏,由於最終程序釋放了全部申請的內存。可是對於一個服務器程序,須要運行幾天,幾周甚至幾個月,不及時釋放內存也可能致使最終耗盡系統的全部內存。因此,咱們稱這類內存泄漏爲隱式內存泄漏。算法
三.內存泄露檢測工具服務器
2.Valgrind-Debugging and profiling Linux programs, aiming at programs written in C and C++.ide
3.IBM Rational PurifyPlus-幫助開發人員查明C/C++、託管.NET、Java和VB6代碼中的性能和可靠性錯誤。PurifyPlus 將內存錯誤和泄漏檢測、應用程序性能描述、代碼覆蓋分析等功能組合在一個單1、完整的工具包中。函數
4.Electric Software GlowCode-包括內存泄漏檢查,code profiler,函數調用跟蹤等功能。給C++和.Net開發者提供完整的錯誤診斷,和運行時性能分析工具包。工具
相關實踐可參考文章:post
(包括利用工具和不使用工具的解決方法,暫列在此,有時間總體總結下)
C/C++的內存泄漏檢測工具Valgrind memcheck的使用經歷
陳皓曾經寫了一系列文章介紹 IBM 的 Purify,值得一看:http://blog.csdn.net/haoel/article/details/2900