女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

內(nèi)存泄漏問題原理及檢視方法

華為開發(fā)者社區(qū) ? 來源:華為開發(fā)者社區(qū) ? 作者:華為開發(fā)者社區(qū) ? 2020-10-10 10:42 ? 次閱讀

可能不少開發(fā)者都遇到過內(nèi)存泄漏導(dǎo)致的網(wǎng)上問題,具體表現(xiàn)為單板在現(xiàn)網(wǎng)運(yùn)行數(shù)月以后,因?yàn)閮?nèi)存耗盡而導(dǎo)致單板復(fù)位現(xiàn)象。一方面,內(nèi)存泄漏問題屬于比較淺顯的錯(cuò)誤,此類問題遺漏到現(xiàn)網(wǎng),影響不好;另一方面,由于內(nèi)存泄漏問題很可能導(dǎo)致單板運(yùn)行固定時(shí)間以后就復(fù)位,只能通過批量升級(jí)才能解決,實(shí)際影響不佳。本文通過介紹內(nèi)存泄漏問題原理及檢視方法,希望后續(xù)能夠從編碼檢視環(huán)節(jié)就杜絕此類問題發(fā)生。

說明:預(yù)防內(nèi)存泄漏問題有多種方法,如加強(qiáng)代碼檢視、工具檢測和內(nèi)存測試等,本文聚集于開發(fā)人員能力提升方面。

01

內(nèi)存泄漏問題原理

堆內(nèi)存在C代碼中的存儲(chǔ)方式

內(nèi)存泄漏問題只有在使用堆內(nèi)存的時(shí)候才會(huì)出現(xiàn),棧內(nèi)存不存在內(nèi)存泄漏問題,因?yàn)闂?nèi)存會(huì)自動(dòng)分配和釋放。C代碼中堆內(nèi)存的申請(qǐng)函數(shù)是malloc,常見的內(nèi)存申請(qǐng)代碼如下:

char *info = NULL; /**轉(zhuǎn)換后的字符串**/ info = (char*)malloc(NB_MEM_SPD_INFO_MAX_SIZE); if( NULL == info) { (void)tdm_error("malloc error! "); return NB_SA_ERR_HPI_OUT_OF_MEMORY; }

由于malloc函數(shù)返回的實(shí)際上是一個(gè)內(nèi)存地址,所以保存堆內(nèi)存的變量一定是一個(gè)指針(除非代碼編寫極其不規(guī)范)。再重復(fù)一遍,保存堆內(nèi)存的變量一定是一個(gè)指針,這對(duì)本文主旨的理解很重要。當(dāng)然,這個(gè)指針可以是單指針,也可以是多重指針。 malloc函數(shù)有很多變種或封裝,如g_malloc、g_malloc0、VOS_Malloc等,這些函數(shù)最終都會(huì)調(diào)用malloc函數(shù)。

堆內(nèi)存的獲取方法

看到本小節(jié)標(biāo)題,可能有些同學(xué)有疑惑,上一小節(jié)中的malloc函數(shù),不就是堆內(nèi)存的獲取方法嗎?的確是,通過malloc函數(shù)申請(qǐng)是最直接的獲取方法,如果只知道這種堆內(nèi)存獲取方法,就容易掉到坑里了。一般的來講,堆內(nèi)存有如下兩種獲取方法: 方法一:將函數(shù)返回值直接賦給指針,一般表現(xiàn)形式如下:

char *local_pointer_xx = NULL;local_pointer_xx = (char*)function_xx(para_xx, …);

該類涉及到內(nèi)存申請(qǐng)的函數(shù),返回值一般都指針類型,例如:

GSList* g_slist_append (GSList *list, gpointer data)

方法二:將指針地址作為函數(shù)返回參數(shù),通過返回參數(shù)保存堆內(nèi)存地址,一般表現(xiàn)形式如下:

int ret; char *local_pointer_xx = NULL; /**轉(zhuǎn)換后的字符串**/ ret = (char*)function_xx(..., &local_pointer_xx, ...);

該類涉及到內(nèi)存申請(qǐng)的函數(shù),一般都有一個(gè)入?yún)⑹请p重指針,例如:

__STDIO_INLINE _IO_ssize_tgetline (char **__lineptr, size_t *__n, FILE *__stream)

前面說通過malloc申請(qǐng)內(nèi)存,就屬于方法一的一個(gè)具體表現(xiàn)形式。其實(shí)這兩類方法的本質(zhì)是一樣的,都是函數(shù)內(nèi)部間接申請(qǐng)了內(nèi)存,只是傳遞內(nèi)存的方法不一樣,方法一通過返回值傳遞內(nèi)存指針,方法二通過參數(shù)傳遞內(nèi)存指針。

內(nèi)存泄漏三要素

最常見的內(nèi)存泄漏問題,包含以下三個(gè)要素:

要素一:函數(shù)內(nèi)有局部指針變量定義;

要素二:對(duì)該局部指針有通過上一小節(jié)中“兩種堆內(nèi)存獲取方法”之一獲取內(nèi)存;

要素三:在函數(shù)返回前(含正常分支和異常分支)未釋放該內(nèi)存,也未保存到其它全局變量或返回給上一級(jí)函數(shù)。

內(nèi)存釋放誤區(qū)

稍微使用過C語言編寫代碼的人,都應(yīng)該知道堆內(nèi)存申請(qǐng)之后是需要釋放的。但為何還這么容易出現(xiàn)內(nèi)存泄漏問題呢?一方面,是開發(fā)人員經(jīng)驗(yàn)不足、意識(shí)不到位或一時(shí)疏忽導(dǎo)致;另一方面,是內(nèi)存釋放誤區(qū)導(dǎo)致。很多開發(fā)人員,認(rèn)為要釋放的內(nèi)存應(yīng)該局限于以下兩種:

(1)直接使用內(nèi)存申請(qǐng)函數(shù)申請(qǐng)出來的內(nèi)存,如malloc、g_malloc等; (2)該開發(fā)人員熟悉的接口中,存在內(nèi)存申請(qǐng)的情況,如iBMC的兄弟,都應(yīng)該知道調(diào)用如下接口需要釋放list指向的內(nèi)存:

dfl_get_object_list(const char* class_name, GSList **list) 按照以上思維編寫代碼,一旦遇到不熟悉的接口中需要釋放內(nèi)存的問題,就完全沒有釋放內(nèi)存的意識(shí),內(nèi)存泄漏問題就自然產(chǎn)生了。

02

內(nèi)存泄漏問題檢視方法

檢視內(nèi)存泄漏問題,關(guān)鍵還是要養(yǎng)成良好的編碼檢視習(xí)慣。與內(nèi)存泄漏三要素對(duì)應(yīng),需要做到如下三點(diǎn):

(1)在函數(shù)中看到有局部指針,就要警惕內(nèi)存泄漏問題,養(yǎng)成進(jìn)一步排查的習(xí)慣;

(2)分析對(duì)局部指針的賦值操作,是否屬于前面所說的“兩種堆內(nèi)存獲取方法”之一,如果是,就要分析函數(shù)返回的指針到底指向啥?是全局?jǐn)?shù)據(jù)、靜態(tài)數(shù)據(jù)還是堆內(nèi)存?對(duì)于不熟悉的接口,要找到對(duì)應(yīng)的接口文檔或源代碼分析;又或者看看代碼中其它地方對(duì)該接口的引用,是否進(jìn)行了內(nèi)存釋放; (3)如果確認(rèn)對(duì)局部指針存在內(nèi)存申請(qǐng)操作,就需要分析該內(nèi)存的去向,是會(huì)被保存在全局變量嗎?又或者會(huì)被作為函數(shù)返回值嗎?如果都不是,就需要排查函數(shù)所有有”return“的地方,保證內(nèi)存被正確釋放。
責(zé)任編輯:YYX

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3108

    瀏覽量

    74983
  • C代碼
    +關(guān)注

    關(guān)注

    1

    文章

    90

    瀏覽量

    14673

原文標(biāo)題:從原理到方法,一文講清如何應(yīng)對(duì)C語言內(nèi)存泄露!

文章出處:【微信號(hào):Huawei_Developer,微信公眾號(hào):華為開發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    快問快答:泄漏等級(jí)有哪些?含閥門氣密性檢測原理方法和解決方案

    一、閥門的泄漏等級(jí)想象一下,一座化工廠的關(guān)鍵管道上,一個(gè)微小的閥門泄漏可能造成數(shù)百萬的損失甚至安全事故。這就是為什么閥門泄漏等級(jí)成為工業(yè)界的「生命線」。閥門的泄漏等級(jí)是衡量閥門關(guān)閉嚴(yán)密
    的頭像 發(fā)表于 04-16 11:34 ?441次閱讀
    快問快答:<b class='flag-5'>泄漏</b>等級(jí)有哪些?含閥門氣密性檢測原理<b class='flag-5'>方法</b>和解決方案

    使用OpenVINO?進(jìn)行推理時(shí)的內(nèi)存泄漏怎么解決?

    使用 OpenVINO? 進(jìn)行推理時(shí),內(nèi)存會(huì)隨著時(shí)間的推移而增加,并導(dǎo)致程序崩潰。
    發(fā)表于 03-06 08:29

    內(nèi)存泄漏檢測工具Sanitizer介紹

    內(nèi)存泄漏,我們經(jīng)常會(huì)遇到,如何檢測內(nèi)存泄漏,除了我們之前講過的 valgrind,還可以使用 gcc 自帶的工具 sanitizer。
    的頭像 發(fā)表于 03-01 14:52 ?536次閱讀

    科普:產(chǎn)品密封泄漏試驗(yàn)等級(jí)評(píng)定標(biāo)準(zhǔn)及方法詳解

    等級(jí)評(píng)定。本文將深入解析泄漏的本質(zhì),闡述泄漏試驗(yàn)等級(jí)評(píng)定的標(biāo)準(zhǔn)和方法,并介紹精誠工科提供的專業(yè)解決方案。一、泄漏的本質(zhì):氣體分子的遷移過程從第一性原理出發(fā),
    的頭像 發(fā)表于 02-06 11:39 ?650次閱讀
    科普:產(chǎn)品密封<b class='flag-5'>泄漏</b>試驗(yàn)等級(jí)評(píng)定標(biāo)準(zhǔn)及<b class='flag-5'>方法</b>詳解

    使用DevEco Studio高效解決鴻蒙原生應(yīng)用內(nèi)存問題

    在鴻蒙原生應(yīng)用開發(fā)過程中,可能由于種種原因?qū)е聭?yīng)用內(nèi)存未被正常地使用或者歸還至操作系統(tǒng),從而引發(fā)內(nèi)存異常占用、內(nèi)存泄漏等問題,最終導(dǎo)致應(yīng)用卡頓甚至崩潰,嚴(yán)重影響用戶體驗(yàn)。
    的頭像 發(fā)表于 01-16 14:44 ?592次閱讀

    免費(fèi)泄漏率計(jì)算工具,讓氣密性檢測變得簡單高效

    泄漏率的計(jì)算方法至關(guān)重要。本文將以通俗易懂的形式,為您介紹常見的泄漏率計(jì)算方法,并提供實(shí)用的計(jì)算公式,讓您輕松掌握氣密檢測的核心技術(shù)。一、泄漏
    的頭像 發(fā)表于 12-18 11:54 ?1128次閱讀
    免費(fèi)<b class='flag-5'>泄漏</b>率計(jì)算工具,讓氣密性檢測變得簡單高效

    虛擬內(nèi)存溢出該怎么處理 虛擬內(nèi)存在服務(wù)器中的應(yīng)用

    、虛擬內(nèi)存溢出的原因 內(nèi)存泄漏 :程序中未正確釋放的內(nèi)存會(huì)導(dǎo)致內(nèi)存泄漏,隨著時(shí)間的推移,這些
    的頭像 發(fā)表于 12-04 09:49 ?695次閱讀

    什么是泄漏電流試驗(yàn)?

    泄漏電流的概念泄漏電流(leakagecurrent)也叫接觸電流,是指在沒有故障施加電壓的情況下,電氣中相互絕緣的金屬零件之間,或帶電零件與接地零件之間,通過其周圍介質(zhì)或絕緣表面所形成的電流。泄漏
    的頭像 發(fā)表于 11-26 11:48 ?1450次閱讀
    什么是<b class='flag-5'>泄漏</b>電流試驗(yàn)?

    RAM內(nèi)存不足的表現(xiàn)及解決方法

    RAM內(nèi)存不足的表現(xiàn)及解決方法 一、RAM內(nèi)存不足的表現(xiàn) 系統(tǒng)運(yùn)行緩慢 當(dāng)RAM內(nèi)存不足時(shí),計(jì)算機(jī)的響應(yīng)速度會(huì)明顯下降,打開程序或文件需要更長的時(shí)間。 頻繁的頁面交換(Page Swa
    的頭像 發(fā)表于 11-11 09:53 ?4054次閱讀

    堆棧和內(nèi)存的基本知識(shí)

    本文主要聊聊關(guān)于堆棧的內(nèi)容。包括堆棧和內(nèi)存的基本知識(shí)。常見和堆棧相關(guān)的 bug,如棧溢出,內(nèi)存泄漏,堆內(nèi)存分配失敗等。后面介紹軟件中堆棧統(tǒng)計(jì)的重要性,以及如何使用工具工具軟件中堆棧使用
    的頭像 發(fā)表于 08-29 14:10 ?933次閱讀
    堆棧和<b class='flag-5'>內(nèi)存</b>的基本知識(shí)

    如何檢測內(nèi)存泄漏

    檢測內(nèi)存泄漏是軟件開發(fā)過程中一項(xiàng)至關(guān)重要的任務(wù),它有助于識(shí)別和解決那些導(dǎo)致程序占用過多內(nèi)存資源,從而影響程序性能甚至導(dǎo)致程序崩潰的問題。以下將詳細(xì)闡述幾種常見的內(nèi)存
    的頭像 發(fā)表于 07-30 11:50 ?3181次閱讀

    包裝泄漏性檢測方法—真空衰減法

    MLT系列微泄漏無損密封測試儀依據(jù)《ASTM F2338-2013 包裝泄漏的標(biāo)準(zhǔn)檢測方法-真空衰減法》標(biāo)準(zhǔn)研發(fā)。適用于預(yù)充式 注射器、水針及粉針瓶(玻璃/塑料)、灌裝壓蓋瓶、奶粉罐、其他硬質(zhì)
    的頭像 發(fā)表于 07-23 16:51 ?1446次閱讀
    包裝<b class='flag-5'>泄漏</b>性檢測<b class='flag-5'>方法</b>—真空衰減法

    NONOS 1.5.3/1.5.4 SSL內(nèi)存泄漏的原因?

    我已經(jīng)通過隨附的代碼驗(yàn)證了當(dāng)發(fā)生 SSL 握手錯(cuò)誤時(shí),會(huì)生成內(nèi)存泄漏 此外,espconn_reconnect_callback不稱為信令ESPCONN_HANDSHAKE - TCP SSL 握手
    發(fā)表于 07-18 07:24

    使用system_show_malloc()檢查內(nèi)存泄漏遇到異常怎么解決?

    我想使用system_show_malloc()檢查內(nèi)存泄漏,但是當(dāng)我調(diào)用該函數(shù)時(shí),我得到了致命的異常: 致命異常 28 (LoadProhibitedCause): epc1
    發(fā)表于 07-10 06:32

    凱迪正大對(duì)高壓電纜泄漏與耐壓試驗(yàn)方法及步驟分享

    為確保高壓電纜的性能和安全進(jìn)行泄漏和耐壓試驗(yàn)是必不可少的環(huán)節(jié),本文還是依照凱迪正大的從業(yè)經(jīng)驗(yàn)介紹高壓電纜泄漏和耐壓試驗(yàn)的方法及步驟。希望能對(duì)大家起到積極的作用,也歡迎大家留言交流討論與指正。
    的頭像 發(fā)表于 06-26 13:48 ?1018次閱讀