內存泄漏及其檢測工具


一、什么是內存泄露

在計算機科學中,內存泄漏指由於疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況。內存泄漏並非指內存在物理上的消失,而是應用程序分配某段內存后,由於設計錯誤,失去了對該段內存的控制,因而造成了內存的浪費。

通常我們所說的內存泄漏是指堆內存的泄漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小可以在程序運行期決定),使用完后必須顯示釋放的內存。應用程序一般使用malloc,realloc,new等函數從堆中分配到一塊內存,使用完后,程序必須負責相應的調用free或delete釋放該內存塊,否則,這塊內存就不能被再次使用,我們就說這塊內存泄漏了。

二.內存泄露的分類

(1)常發性內存泄漏:發生內存泄漏的代碼會被多次執行到,每次被執行的時候都會導致一塊內存泄漏。 
(2)偶發性內存泄漏:發生內存泄漏的代碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。 
(3)一次性內存泄漏:發生內存泄漏的代碼只會被執行一次,或者由於算法上的缺陷,導致總會有一塊僅且一塊內存發生泄漏。比如,在一個Singleton類的構造函數中分配內存,在析構函數中卻沒有釋放該內存。而Singleton類只存在一個實例,所以內存泄漏只會發生一次。 
(4)隱式內存泄漏:程序在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這里並沒有發生內存泄漏,因為最終程序釋放了所有申請的內存。但是對於一個服務器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存泄漏為隱式內存泄漏。

三.內存泄露檢測工具

 

工具挺多的,這里我只列出以下幾種:
1.Leaky-Linux下檢測內存泄漏的程序。

2.Valgrind-Debugging and profiling Linux programs, aiming at programs written in C and C++.

 

3.IBM Rational PurifyPlus-幫助開發人員查明C/C++、托管.NET、Java和VB6代碼中的性能和可靠性錯誤。PurifyPlus 將內存錯誤和泄漏檢測、應用程序性能描述、代碼覆蓋分析等功能組合在一個單一、完整的工具包中。

4.Electric Software GlowCode-包括內存泄漏檢查,code profiler,函數調用跟蹤等功能。給C++和.Net開發者提供完整的錯誤診斷,和運行時性能分析工具包。

 

 

 

相關實踐可參考文章:

(包括利用工具和不使用工具的解決方法,暫列在此,有時間整體總結下)

C/C++的內存泄漏檢測工具Valgrind memcheck的使用經歷

 內存泄漏以及常見的解決方法

C++內存泄漏及檢測工具詳解

陳皓曾經寫了一系列文章介紹 IBM 的 Purify,值得一看:http://blog.csdn.net/haoel/article/details/2900

由一道題引起的對內存泄露的思考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM