記憶體洩漏的防範和檢測方法

2021-06-21 05:09:30 字數 1663 閱讀 9560

本文出自 「

至簡李雲

」 部落格,請務必保留此出處

在c/c++程式設計中記憶體洩漏是乙個非常普遍和令人頭痛的問題,這一問題在嵌入式系統中更為突出。那麼如何採用一種好的方法來防範和檢測記憶體洩漏呢?常用的做法有以下幾種。

1)採用**審查的方式進行控制。這種方法是最容易想到的,但是效果也是相當的有限的。當程式複雜度增加的時候,這種方法就越加顯得無能為力了。

2)採用一定的工具來幫助發現記憶體洩漏。比如來自ibm的purify、開源的valgrind,等等。這些工具在使用時都不需要我們去改變程式源**,其使用大至也可以分為兩類。第一類是需要對**進行重新編譯,這種方法通常使用起來相對的麻煩,為了方便使用,通常需要將工具與專案的編譯環境進行整合。上面所提及的purify就是採用這類方法的。另一類則不需要對**進行重新編譯,因此,使用起來相當的方便,上面所說到的開源專案valgrind就是屬於這一類的。使用這些工具用於檢測記憶體洩漏時,我們應當注意兩點。第一,我們要保證我們的**在測試時有盡可能高的**覆蓋率。這是因為,記憶體洩漏的檢測需要**被執行到了,檢測工具才能發現。現實情況是,我們往往很難做到百分之百的**覆蓋率,因此檢測的效果也是有限的。第二,由於這些工具對於被測程式(**)的效能有及大的影響,因此,如果記憶體洩漏檢測工具的使用造成程式無法正常執行,那麼這類工具是無法使用的。由於以上兩點在測試時很有可能造成條件無法滿足,因此,不能成為記憶體洩漏檢測的終級解決方法。

3)採用一定的封裝技術對記憶體的分配與釋放進行接管。通常提供乙個模組或是庫對malloc ()、free ()、new、delete和delete 進行很薄的一層封裝,然後向應用程式提供相應的api用於分配和釋放記憶體。此外,這個封裝層還提供一定的方式讓我們能實時的得到執行時記憶體的使用情況。比如,我們可以看一看剛過去的30分鐘內有哪些模組分配了記憶體且還沒有釋放,這種方式對於我們現實產品很有意義。比如,對於通訊產品,其可靠性要求通常都很高,我們需要在不終止提供服務的情況下得知當前系統是否有記憶體洩漏。還有,這種方法由於記憶體管理模組是作為最終軟體產品的一部分的,因此,我們可以隨時得知記憶體的使用情況,這與前面提到的第二種方法是完全不一樣的。

對於上面三種情況,從解決方案來看第三種方案最好,但其也存在一些值得我們關注的問題。其一,由於記憶體管理模組對於每一次記憶體分配需要記錄在哪個檔案以及檔案的哪一行以用於在需要時顯示這些資訊。因此,存在一定的記憶體開銷。其二,由於增加了一層的封裝,儘管很薄,但記憶體的分配速度還是會有一點點下降,下降的程式取決於管理演算法。從以上兩點來看,第三種方法是通過時間和空間來換取實用性的,還是那句話「沒有免費的午餐」。

對於不少的產品,由於記憶體容量不是乙個問題、以及cpu的處理速度也足夠的快,因此,方法三應當是首選。前面兩種方法,在使用上過度的依賴於人或工具,所以很不方便,且對於產品的執行時記憶體洩漏檢測存在一定的侷限性。當然,對於第三種方法的可操作性還存在乙個問題,比如,程式設計師並沒有採用封裝後的api,而是仍然不小心呼叫了c/c++庫的malloc ()和new,那麼對於這些記憶體分配操作,其擾過了我們的記憶體管理模組。對於這一問題,解決方法就是通過**審查或是採用搜尋工具(很多**編輯工具都提供搜尋功能)進行搜尋,看看malloc ()和new是否被呼叫了,以防止這類事情的發生。

值得一提的是,前面方法二中提到的工具,通常除了記憶體洩漏的檢測外,還可以對很多其它的記憶體使用問題進行檢測,比如,使用沒有初始化的指標、記憶體上溢和下溢位,等等。而這些功能在方法三中是做不到的或者說即使做到了執行時開銷也很大,因此,在現實中我們通常會將方法二和方法三結合使用。顯然,每種方法所針對的問題是不同的。

C 記憶體洩漏檢測方法

原文參考引用自部落格 c 中的記憶體洩露一般指堆中的記憶體洩露。堆記憶體是我們手動malloc realloc new申請的,程式不會自動 需要呼叫free或delete手動釋放,否則就會造成記憶體洩露。記憶體洩露其實還應該包括系統資料的洩露,比如socket連線等,使用完後也要釋放。記憶體洩露的原...

C C 記憶體洩漏檢測方法

1.記憶體洩漏 記憶體洩漏 memory leak 是指程式中已動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。2.檢測 使用鍊錶記錄每個malloc返回的指標,釋放時從鍊錶中查詢並刪除找到對應指標的節點。最終輸出鍊錶,該鍊錶記錄...

qt記憶體洩漏檢測 qt 關於記憶體洩漏的檢測

qt 關於記憶體洩露的檢測 工具篇關於qt 記憶體洩露的檢測工具有很多種,一下挑幾種來說 1 檢測已分配資源,第乙個工具是乙個記憶體資源使用的 它只能在模擬器上進行除錯.可以使用快捷鍵來呼叫 按鍵 功能 ctrl alt shift a 顯示已分配堆單元的數量 ctrl alt shift b 顯示...