国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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)存泄漏問(wèn)題原理及檢視方法

華為開發(fā)者社區(qū) ? 來(lái)源:華為開發(fā)者社區(qū) ? 作者:華為開發(fā)者社區(qū) ? 2020-10-10 10:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

01

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

堆內(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,常見的內(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)存的獲取方法嗎?的確是,通過(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, …);

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

GSList* g_slist_append (GSList *list, gpointer data)

方法二:將指針地址作為函數(shù)返回參數(shù),通過(guò)返回參數(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)

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

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

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

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

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

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

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

稍微使用過(guò)C語(yǔ)言編寫代碼的人,都應(yīng)該知道堆內(nèi)存申請(qǐng)之后是需要釋放的。但為何還這么容易出現(xiàn)內(nèi)存泄漏問(wèn)題呢?一方面,是開發(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)出來(lái)的內(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)存的問(wèn)題,就完全沒有釋放內(nèi)存的意識(shí),內(nèi)存泄漏問(wèn)題就自然產(chǎn)生了。

02

內(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)的接口文檔或源代碼分析;又或者看看代碼中其它地方對(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)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    9

    文章

    3209

    瀏覽量

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

    關(guān)注

    1

    文章

    90

    瀏覽量

    15182

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    儲(chǔ)能安全警報(bào):冷卻液泄漏的隱患與檢測(cè)難題 | 星科創(chuàng)科技解讀

    深圳市星科創(chuàng)科技有限公司深度剖析儲(chǔ)能系統(tǒng)中冷卻液/電解液泄漏的巨大安全隱患,揭示傳統(tǒng)檢測(cè)方法的局限,并提出創(chuàng)新的非接觸檢測(cè)思路。
    的頭像 發(fā)表于 01-22 17:18 ?549次閱讀

    化工廠液體泄漏識(shí)別預(yù)警系統(tǒng)

    化工廠液體泄漏識(shí)別預(yù)警系統(tǒng)基于人工智能分析技術(shù),化工廠液體泄漏識(shí)別預(yù)警系統(tǒng)自動(dòng)識(shí)別監(jiān)控視頻中機(jī)械管道是否存在液體泄漏行為。如檢測(cè)到液體泄漏,立即反饋給后臺(tái)人員及時(shí)處理。化工廠液體
    的頭像 發(fā)表于 12-17 18:29 ?322次閱讀
    化工廠液體<b class='flag-5'>泄漏</b>識(shí)別預(yù)警系統(tǒng)

    WebGL/Canvas 內(nèi)存泄露分析

    在構(gòu)建高性能、長(zhǎng)周期運(yùn)行的 WebGL/Canvas 應(yīng)用(如 3D 編輯器、數(shù)據(jù)可視化平臺(tái))時(shí),內(nèi)存管理是一個(gè)至關(guān)重要且極具挑戰(zhàn)性的課題。 開發(fā)者通常面臨的內(nèi)存泄漏問(wèn)題,其根源遠(yuǎn)比簡(jiǎn)單
    的頭像 發(fā)表于 10-21 11:40 ?407次閱讀
    WebGL/Canvas <b class='flag-5'>內(nèi)存</b>泄露分析

    at_device 包 ml307長(zhǎng)時(shí)間運(yùn)行有內(nèi)存泄漏問(wèn)題怎么解決?

    使用 at_device 包中的 ml307 包長(zhǎng)時(shí)間運(yùn)行有大量內(nèi)存泄漏問(wèn)題,大概漲了20K,求助解決。
    發(fā)表于 09-24 07:41

    產(chǎn)品密封性防水泄漏標(biāo)準(zhǔn)如何判定?精誠(chéng)工科氣密性檢測(cè)儀的設(shè)置方法

    工程師們經(jīng)常遇到的實(shí)際問(wèn)題。下面,精誠(chéng)工科結(jié)合行業(yè)經(jīng)驗(yàn),為您詳細(xì)解讀。一、正確認(rèn)識(shí)產(chǎn)品泄漏泄漏的本質(zhì)是什么?泄漏不是簡(jiǎn)單的「漏」與「不漏」,而是分子級(jí)別的傳質(zhì)過(guò)程
    的頭像 發(fā)表于 09-15 14:02 ?952次閱讀
    產(chǎn)品密封性防水<b class='flag-5'>泄漏</b>標(biāo)準(zhǔn)如何判定?精誠(chéng)工科氣密性檢測(cè)儀的設(shè)置<b class='flag-5'>方法</b>

    如何通過(guò)PinView檢查I/O電流泄漏

    如何通過(guò)PinView檢查I/O電流泄漏
    發(fā)表于 08-25 07:45

    在OpenVINO? C++代碼中啟用 AddressSanitizer 時(shí)的內(nèi)存泄漏怎么解決?

    在 OpenVINO? C++代碼中啟用 AddressSanitizer 時(shí)遇到內(nèi)存泄漏: \"#0 0xaaaab8558370 in operator new(unsigned
    發(fā)表于 06-23 07:16

    鴻蒙5開發(fā)寶藏案例分享---內(nèi)存優(yōu)化實(shí)戰(zhàn)指南

    ,里面提供的工具和技巧簡(jiǎn)直太香了!很多案例和方法,在實(shí)際開發(fā)中真的能救命,避免應(yīng)用卡頓、崩潰,還能讓設(shè)備續(xù)航更持久。 今天就來(lái)跟大家好好分享這份寶藏,結(jié)合官方內(nèi)容和我的理解,整理成這篇實(shí)戰(zhàn)性超強(qiáng)的內(nèi)存優(yōu)化
    發(fā)表于 06-12 17:15

    HarmonyOS優(yōu)化應(yīng)用內(nèi)存占用問(wèn)題性能優(yōu)化一

    可以避免圖片過(guò)大或過(guò)小導(dǎo)致的顯示問(wèn)題,并提高應(yīng)用程序的用戶體驗(yàn)。 二、多種****方法 在日常開發(fā)中,常見的其他減少內(nèi)存方式有如下幾種: 使用虛引用(Weak Reference):在HarmonyOS
    發(fā)表于 05-21 11:27

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

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

    傳統(tǒng)檢測(cè)方法VS電子芯片氣密性檢測(cè)儀,差距一目了然

    水中,觀察是否有汽泡來(lái)判定芯片是否泄漏。這類方法簡(jiǎn)易直觀,但存在很多問(wèn)題。一方面,它只能檢測(cè)到較大的泄漏,很難發(fā)現(xiàn)微小的泄漏,但這些微小的泄漏
    的頭像 發(fā)表于 04-14 14:07 ?594次閱讀
    傳統(tǒng)檢測(cè)<b class='flag-5'>方法</b>VS電子芯片氣密性檢測(cè)儀,差距一目了然

    推薦兩款菲力爾氣體泄漏檢測(cè)神器

    在石化行業(yè),氣體泄漏是安全生產(chǎn)的“大敵”。如何快速、精準(zhǔn)地檢測(cè)泄漏,成了企業(yè)關(guān)注的焦點(diǎn)。今天,小菲就帶大家聊聊菲力爾的兩款“氣體泄漏檢測(cè)神器”——FLIR Si2x系列聲學(xué)成像儀和Gx系列光學(xué)氣體成像熱像儀。它們都能“看到”氣體
    的頭像 發(fā)表于 04-07 11:22 ?1012次閱讀

    快速搞懂C語(yǔ)言程序內(nèi)存分區(qū)!

    到動(dòng)態(tài)分配的數(shù)據(jù)等內(nèi)容。(內(nèi)存分區(qū)圖示)理解這些內(nèi)存分區(qū)的結(jié)構(gòu)和特性,不僅有助于編寫更高效的代碼,還能幫助排查和解決如段錯(cuò)誤、內(nèi)存泄漏、棧溢出等常見問(wèn)題。以下是常見的六
    的頭像 發(fā)表于 03-14 17:37 ?1565次閱讀
    快速搞懂C語(yǔ)言程序<b class='flag-5'>內(nèi)存</b>分區(qū)!

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

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