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