前言
今天在做項目的時候被發現有個指針變量的輸出值總是莫名其妙,最后查清了原因發現是因為內存泄漏了!
有些小伙伴看到這就有點疑惑了,怎么內存還會泄漏呢?我只聽過漏水、漏油,還沒聽過內存還會泄漏!
內存泄漏幾乎是很難避免的,不管是老手還是新手,都存在這個問題,甚至 Windows 與 Linux 這類系統軟件也或多或少存在著內存泄漏。
所以我還是那句話:不會用指針就不要用,不要你埋的雷讓我來踩!
什么是內存泄漏
在計算機科學中,內存泄漏指由于疏忽或錯誤造成程序未能釋放已經不再使用的內存。
內存泄漏并非指內存在物理上的消失,而指程序中已動態分配的堆內存由于某種原因程序未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重后果。
在C中出現內存泄漏的主要原因就是程序猿在申請了內存后,沒有及時釋放沒用的內存空間,甚至消滅了指針導致該區域內存空間根本無法釋放。
知道了出現內存泄漏的原因就能知道如何應對內存泄漏,即:不用了的內存空間記得釋放,不釋放留著過年哇!
內存泄漏的嚴重后果
要說內存泄漏的后果,那我就告訴你,內存泄漏會讓你查程序查到懷疑人生,特別是對于新人來說,自己本來就對指針、內存這些東西不太熟悉,自己也不敢用,結果由于“大佬”的自信操作,造成你查起來真的非常非常費勁!
因為內存泄漏的堆積,最終消耗盡系統所有的內存。所以一次性內存泄漏并沒有什么危害,因為一次性的內存泄漏并不會堆積。但是如果你遇到的是隱式內存泄漏的危害性則非常大,因為較之于常發性,偶發性內存泄漏它更難被檢測到。
長期運行的程序出現內存泄漏,影響很大,如操作系統、后臺服務等等,出現內存泄漏會導致響應越來越慢,最終卡死。
內存泄漏有哪些現象
發生內存泄漏的代碼會被多次執行到,每次被執行的時候都會導致一塊內存泄漏,所以當你程序出現莫名其妙的問題時,記得想到這點。
另外內存泄漏還具有偶發性,發生內存泄漏的代碼只會被執行一次,或者由于算法上的缺陷,導致總會有一塊且僅一塊內存發生泄漏,同樣會出現莫名其妙的問題,并且這種問題還不是每次都會發生,比上面的情況更加莫名其妙。
程序在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這里并沒有發生內存泄漏,因為最終程序釋放了所有申請的內存。
但是對于一個程序,可能需要運行幾天、幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存泄漏為隱式內存泄漏。
如何避免內存泄漏
關于如何避免內存泄漏我總結了以下幾點:
在函數中看到有局部指針,就要警惕內存泄漏問題,養成進一步排查的習慣;
在內存分配后別忘記使用 free 進行釋放,alloca 函數除外;
確保自己寫的程序沒有在訪問空指針;
每次分配內存之后都應該及時進行初始化,可以結合 memset 函數進行初始化,calloc 函數除外;
每當向指針寫入值時,都要確保對可用字節數和所寫入的字節數進行交叉核對;
在對指針賦值前,一定要確保沒有內存位置會變為孤立的;
始終正確處理返回動態分配的內存引用的函數返回值;
結語
由于我是做汽車行業SOC開發的,所以內存泄漏真的很可怕,你想想你正在高速上開著車,結果由于內存泄漏,你的車載系統突然崩潰,你想想可怕不,剎車失靈,方向盤卡死!
所以汽車行業對于內存泄漏的要求是非常嚴格,會有專人review你寫的代碼,如果你申請完內存不釋放,那你完了!
審核編輯:劉清
-
WINDOWS
+關注
關注
3文章
3526瀏覽量
88452 -
Linux系統
+關注
關注
4文章
592瀏覽量
27360 -
內存泄漏
+關注
關注
0文章
39瀏覽量
9206
原文標題:我真的被C語言里的內存泄漏整蒙了
文章出處:【微信號:嵌入式悅翔園,微信公眾號:嵌入式悅翔園】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論