天天看點

我真的被C語言裡的記憶體洩漏整蒙了…

作者:嵌入式Linux

今天在做項目的時候,被發現有個指針變量的輸出值總是莫名其妙,最後查清了原因發現是因為記憶體洩漏了!

有些小夥伴看到這就有點疑惑了,怎麼記憶體還會洩漏呢?我隻聽過漏水、漏油,還沒聽過記憶體還會洩漏!

記憶體洩漏幾乎是很難避免的,不管是老手還是新手,都存在這個問題,甚至 Windows 與 Linux 這類系統軟體也或多或少存在着記憶體洩漏。

是以我還是那句話:不會用指針就不要用,不要你埋的雷讓我來踩!

1. 什麼是記憶體洩漏

在計算機科學中,記憶體洩漏指由于疏忽或錯誤造成程式未能釋放已經不再使用的記憶體。

記憶體洩漏并非指記憶體在實體上的消失,而指程式中已動态配置設定的堆記憶體由于某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導緻程式運作速度減慢甚至系統崩潰等嚴重後果。

在C中出現記憶體洩漏的主要原因就是程式猿在申請了記憶體後,沒有及時釋放沒用的記憶體空間,甚至消滅了指針導緻該區域記憶體空間根本無法釋放。

知道了出現記憶體洩漏的原因就能知道如何應對記憶體洩漏,即:不用了的記憶體空間記得釋放,不釋放留着過年哇!

嵌入式物聯網需要學的東西真的非常多,千萬不要學錯了路線和内容,導緻工資要不上去!

無償分享大家一個資料包,差不多150多G。裡面學習内容、面經、項目都比較新也比較全!某魚上買估計至少要好幾十。

點選這裡找小助理0元領取:加微信領取資料

我真的被C語言裡的記憶體洩漏整蒙了…
我真的被C語言裡的記憶體洩漏整蒙了…

2. 記憶體洩漏的嚴重後果

要說記憶體洩漏的後果,那我就告訴你,記憶體洩漏會讓你查程式查到懷疑人生,特别是對于新人來說,自己本來就對指針、記憶體這些東西不太熟悉,自己也不敢用,結果由于“大佬”的自信操作,造成你查起來真的非常非常費勁!

因為記憶體洩漏的堆積,最終消耗盡系統所有的記憶體。是以一次性記憶體洩漏并沒有什麼危害,因為一次性的記憶體洩漏并不會堆積。但是如果你遇到的是隐式記憶體洩漏的危害性則非常大,因為較之于常發性,偶發性記憶體洩漏它更難被檢測到。

長期運作的程式出現記憶體洩漏,影響很大,如作業系統、背景服務等等,出現記憶體洩漏會導緻響應越來越慢,最終卡死。

3. 記憶體洩漏有哪些現象

發生記憶體洩漏的代碼會被多次執行到,每次被執行的時候都會導緻一塊記憶體洩漏,是以當你程式出現莫名其妙的問題時,記得想到這點。

另外記憶體洩漏還具有偶發性,發生記憶體洩漏的代碼隻會被執行一次,或者由于算法上的缺陷,導緻總會有一塊且僅一塊記憶體發生洩漏,同樣會出現莫名其妙的問題,并且這種問題還不是每次都會發生,比上面的情況更加莫名其妙。

程式在運作過程中不停的配置設定記憶體,但是直到結束的時候才釋放記憶體。嚴格的說這裡并沒有發生記憶體洩漏,因為最終程式釋放了所有申請的記憶體。

但對于一個程式,可能需要運作幾天、幾周甚至幾個月,不及時釋放記憶體也可能導緻最終耗盡系統的所有記憶體。是以,我們稱這類記憶體洩漏為隐式記憶體洩漏。

4. 如何避免記憶體洩漏

關于如何避免記憶體洩漏我總結了以下幾點:

  • 在函數中看到有局部指針,就要警惕記憶體洩漏問題,養成進一步排查的習慣;
  • 在記憶體配置設定後别忘記使用 free 進行釋放,alloca 函數除外;
  • 確定自己寫的程式沒有在通路空指針;
  • 每次配置設定記憶體之後都應該及時進行初始化,可以結合 memset 函數進行初始化,calloc 函數除外;
  • 每當向指針寫入值時,都要確定對可用位元組數和所寫入的位元組數進行交叉核對;
  • 在對指針指派前,一定要確定沒有記憶體位置會變為孤立的;
  • 始終正确處理傳回動态配置設定的記憶體引用的函數傳回值。

5. 結語

由于我是做汽車行業SOC開發的,是以記憶體洩漏真的很可怕,你想想你正在高速上開着車,結果由于記憶體洩漏,你的車載系統突然崩潰,你想想可怕不,刹車失靈,方向盤卡死!

是以汽車行業對于記憶體洩漏的要求是非常嚴格,會有專人review你寫的代碼,如果你申請完記憶體不釋放,那你完了!

我真的被C語言裡的記憶體洩漏整蒙了…

END

文章連結:https://mp.weixin.qq.com/s/3sxaoBU_-CqGcBuJVmAXwg

轉載自:嵌入式微處理器

文章來源:嵌入式悅翔園 ,作者JamesBin

文章連結:我真的被C語言裡的記憶體洩漏整蒙了…

版權申明:本文來源于網絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯系我進行删除。

繼續閱讀