




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C語(yǔ)言?xún)?nèi)存泄露很?chē)?yán)重的解決方案目錄1.前言2.內(nèi)存泄漏問(wèn)題原理2.1堆內(nèi)存在C代碼中的存儲(chǔ)方式2.2堆內(nèi)存的獲取方法2.3內(nèi)存泄漏三要素2.4內(nèi)存釋放誤區(qū)3.內(nèi)存泄漏問(wèn)題檢視方法
1.前言
最近部門(mén)不同產(chǎn)品接連出現(xiàn)內(nèi)存泄漏導(dǎo)致的網(wǎng)上問(wèn)題,具體表現(xiàn)為單板在現(xiàn)網(wǎng)運(yùn)行數(shù)月以后,因?yàn)閮?nèi)存耗盡而導(dǎo)致單板復(fù)位現(xiàn)象。
一方面,內(nèi)存泄漏問(wèn)題屬于低級(jí)錯(cuò)誤,此類(lèi)問(wèn)題遺漏到現(xiàn)網(wǎng),影響很壞;另一方面,由于內(nèi)存泄漏問(wèn)題很可能導(dǎo)致單板運(yùn)行固定時(shí)間以后就復(fù)位,只能通過(guò)批量升級(jí)才能解決,實(shí)際影響也很惡劣。
同時(shí),接連出現(xiàn)此類(lèi)問(wèn)題,尤其是其中一例問(wèn)題還是我們老員工修改引入,說(shuō)明我們不少員工對(duì)內(nèi)存泄漏問(wèn)題認(rèn)識(shí)還是不夠深刻的。
本文通過(guò)介紹內(nèi)存泄漏問(wèn)題原理及檢視方法,希望后續(xù)能夠從編碼檢視環(huán)節(jié)就杜絕此類(lèi)問(wèn)題發(fā)生。
說(shuō)明:預(yù)防內(nèi)存泄漏問(wèn)題有多種方法,比如加強(qiáng)代碼檢視、工具檢測(cè)和內(nèi)存測(cè)試等,本文聚集于開(kāi)發(fā)人員能力提升方面。
2.內(nèi)存泄漏問(wèn)題原理
2.1堆內(nèi)存在C代碼中的存儲(chǔ)方式
內(nèi)存泄漏問(wèn)題只有在使用堆內(nèi)存的時(shí)候才會(huì)出現(xiàn),棧內(nèi)存不存在內(nèi)存泄漏問(wèn)題,因?yàn)闂?nèi)存會(huì)自動(dòng)分配和釋放。
C代碼中堆內(nèi)存的申請(qǐng)函數(shù)是malloc,常見(jiàn)的內(nèi)存申請(qǐng)代碼如下:
char*info=NULL;/**轉(zhuǎn)換后的字符串**/
info=(char*)malloc(NB_MEM_SPD_INFO_MAX_SIZE);
if(NULL==info)
(void)tdm_error("mallocerror!\n");
returnNB_SA_ERR_HPI_OUT_OF_MEMORY;
}
由于malloc函數(shù)返回的實(shí)際上是一個(gè)內(nèi)存地址,所以保存堆內(nèi)存的變量一定是一個(gè)指針(除非代碼編寫(xiě)極其不規(guī)范)。
再重復(fù)一遍,保存堆內(nèi)存的變量一定是一個(gè)指針,這對(duì)本文主旨的理解很重要。當(dāng)然,這個(gè)指針可以是單指針,也可以是多重指針。
malloc函數(shù)有很多變種或封裝,如g_malloc、g_malloc0、VOS_Malloc等,這些函數(shù)最終都會(huì)調(diào)用malloc函數(shù)。
2.2堆內(nèi)存的獲取方法
看到本小節(jié)標(biāo)題,可能有些同學(xué)有疑惑,上一小節(jié)中的malloc函數(shù),不就是堆內(nèi)存的獲取方法嗎?
的確是,通過(guò)malloc函數(shù)申請(qǐng)是最直接的獲取方法,如果只知道這種堆內(nèi)存獲取方法,就容易掉到坑里了。
一般的來(lái)講,堆內(nèi)存有如下兩種獲取方法:
方法一:將函數(shù)返回值直接賦給指針,一般表現(xiàn)形式如下:
char*local_pointer_xx=NULL;
local_pointer_xx=(char*)function_xx(para_xx,…);
該類(lèi)涉及到內(nèi)存申請(qǐng)的函數(shù),返回值一般都指針類(lèi)型,例如:
GSList*g_slist_append(GSList*list,gpointerdata);
方法二:將指針地址作為函數(shù)返回參數(shù),通過(guò)返回參數(shù)保存堆內(nèi)存地址,一般表現(xiàn)形式如下:
intret;
char*local_pointer_xx=NULL;/**轉(zhuǎn)換后的字符串**/
ret=(char*)function_xx(...,local_pointer_xx,...);
該類(lèi)涉及到內(nèi)存申請(qǐng)的函數(shù),一般都有一個(gè)入?yún)⑹请p重指針,例如:
__STDIO_INLINE_IO_ssize_t;
getline(char**__lineptr,size_t*__n,FILE*__stream);
前面說(shuō)通過(guò)malloc申請(qǐng)內(nèi)存,就屬于方法一的一個(gè)具體表現(xiàn)形式。其實(shí)這兩類(lèi)方法的本質(zhì)是一樣的,都是函數(shù)內(nèi)部間接申請(qǐng)了內(nèi)存,只是傳遞內(nèi)存的方法不一樣,方法一通過(guò)返回值傳遞內(nèi)存指針,方法二通過(guò)參數(shù)傳遞內(nèi)存指針。
2.3內(nèi)存泄漏三要素
最常見(jiàn)的內(nèi)存泄漏問(wèn)題,包含以下三個(gè)要素:
函數(shù)內(nèi)有局部指針變量定義;對(duì)該局部指針有通過(guò)上一小節(jié)中兩種堆內(nèi)存獲取方法之一獲取內(nèi)存;在函數(shù)返回前(含正常分支和異常分支)未釋放該內(nèi)存,也未保存到其它全局變量或返回給上一級(jí)函數(shù)。
2.4內(nèi)存釋放誤區(qū)
稍微使用過(guò)C語(yǔ)言編寫(xiě)代碼的人,都應(yīng)該知道堆內(nèi)存申請(qǐng)之后是需要釋放的。但為何還這么容易出現(xiàn)內(nèi)存泄漏問(wèn)題呢?
一方面,是開(kāi)發(fā)人員經(jīng)驗(yàn)不足、意識(shí)不到位或一時(shí)疏忽導(dǎo)致;另一方面,是內(nèi)存釋放誤區(qū)導(dǎo)致。
很多開(kāi)發(fā)人員,認(rèn)為要釋放的內(nèi)存應(yīng)該局限于以下兩種:
1)直接使用內(nèi)存申請(qǐng)函數(shù)申請(qǐng)出來(lái)的內(nèi)存,比如malloc、g_malloc等;2)該開(kāi)發(fā)人員熟悉的接口中,存在內(nèi)存申請(qǐng)的情況,如iBMC的兄弟,都應(yīng)該知道調(diào)用如下接口需要釋放list指向的內(nèi)存:
dfl_get_object_list(constchar*class_name,GSList**list);
按照以上思維編寫(xiě)代碼,一旦遇到不熟悉的接口中需要釋放內(nèi)存的問(wèn)題,就完全沒(méi)有釋放內(nèi)存的意識(shí),內(nèi)存泄漏問(wèn)題就自然產(chǎn)生了。
3.內(nèi)存泄漏問(wèn)題檢視方法
檢視內(nèi)存泄漏問(wèn)題,關(guān)鍵還是要養(yǎng)成良好的編碼檢視習(xí)慣。與內(nèi)存泄漏三要素對(duì)應(yīng),需
要做到如下三點(diǎn):
1)在函數(shù)中看到有局部指針,就要警惕內(nèi)存泄漏問(wèn)題,養(yǎng)成進(jìn)一步排查的習(xí)慣2)分析對(duì)局部指針的賦值操作,是否屬于前面所說(shuō)的兩種堆內(nèi)存獲取方法之一,如果是,就要分析函數(shù)返回的指針到底指向啥?是全局?jǐn)?shù)據(jù)、靜態(tài)數(shù)據(jù)還是堆內(nèi)存?對(duì)于不熟悉的接口,要找到對(duì)應(yīng)的接口文檔或源代碼分析;又或者
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度智能監(jiān)控系統(tǒng)維護(hù)保養(yǎng)服務(wù)合同范本
- 二零二五年度賓館會(huì)議室租賃合同書(shū)-商務(wù)談判會(huì)議室租賃協(xié)議
- 二零二五年度體育場(chǎng)館設(shè)施租賃管理合同
- 二零二五年茶園農(nóng)業(yè)廢棄物資源化利用合同
- 二零二五年度二手房購(gòu)房合同電子版下載秘籍
- 二零二五年度房地產(chǎn)投資咨詢(xún)代理銷(xiāo)售合同
- 2025版跨境電商配送與清關(guān)服務(wù)合同
- 2025版家政公司員工薪酬績(jī)效管理合同范本
- 2025年度智能家居專(zhuān)利授權(quán)合同書(shū)
- 流動(dòng)的顏色課件首頁(yè)
- 2024年重慶永川區(qū)招聘社區(qū)工作者后備人選筆試真題
- 醫(yī)學(xué)技術(shù)專(zhuān)業(yè)講解
- 唯奮斗最青春+課件-2026屆跨入高三第一課主題班會(huì)
- 2025民辦中學(xué)教師勞務(wù)合同模板
- 2025年南康面試題目及答案
- 2025年事業(yè)單位考試貴州省畢節(jié)地區(qū)納雍縣《公共基礎(chǔ)知識(shí)》考前沖刺試題含解析
- 高中喀斯特地貌說(shuō)課課件
- 黃岡初一上數(shù)學(xué)試卷
- 2025年中國(guó)花盆人參行業(yè)市場(chǎng)發(fā)展前景及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- QGDW11337-2023輸變電工程工程量清單計(jì)價(jià)規(guī)范
- 留疆戰(zhàn)士考試試題及答案
評(píng)論
0/150
提交評(píng)論