在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

內存泄漏問題原理及檢視方法

華為開發者社區 ? 來源:華為開發者社區 ? 作者:華為開發者社區 ? 2020-10-10 10:42 ? 次閱讀

可能不少開發者都遇到過內存泄漏導致的網上問題,具體表現為單板在現網運行數月以后,因為內存耗盡而導致單板復位現象。一方面,內存泄漏問題屬于比較淺顯的錯誤,此類問題遺漏到現網,影響不好;另一方面,由于內存泄漏問題很可能導致單板運行固定時間以后就復位,只能通過批量升級才能解決,實際影響不佳。本文通過介紹內存泄漏問題原理及檢視方法,希望后續能夠從編碼檢視環節就杜絕此類問題發生。

說明:預防內存泄漏問題有多種方法,如加強代碼檢視、工具檢測和內存測試等,本文聚集于開發人員能力提升方面。

01

內存泄漏問題原理

堆內存在C代碼中的存儲方式

內存泄漏問題只有在使用堆內存的時候才會出現,棧內存不存在內存泄漏問題,因為棧內存會自動分配和釋放。C代碼中堆內存的申請函數是malloc,常見的內存申請代碼如下:

char *info = NULL; /**轉換后的字符串**/ 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函數返回的實際上是一個內存地址,所以保存堆內存的變量一定是一個指針(除非代碼編寫極其不規范)。再重復一遍,保存堆內存的變量一定是一個指針,這對本文主旨的理解很重要。當然,這個指針可以是單指針,也可以是多重指針。 malloc函數有很多變種或封裝,如g_malloc、g_malloc0、VOS_Malloc等,這些函數最終都會調用malloc函數。

堆內存的獲取方法

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

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

該類涉及到內存申請的函數,返回值一般都指針類型,例如:

GSList* g_slist_append (GSList *list, gpointer data)

方法二:將指針地址作為函數返回參數,通過返回參數保存堆內存地址,一般表現形式如下:

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

該類涉及到內存申請的函數,一般都有一個入參是雙重指針,例如:

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

前面說通過malloc申請內存,就屬于方法一的一個具體表現形式。其實這兩類方法的本質是一樣的,都是函數內部間接申請了內存,只是傳遞內存的方法不一樣,方法一通過返回值傳遞內存指針,方法二通過參數傳遞內存指針。

內存泄漏三要素

最常見的內存泄漏問題,包含以下三個要素:

要素一:函數內有局部指針變量定義;

要素二:對該局部指針有通過上一小節中“兩種堆內存獲取方法”之一獲取內存;

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

內存釋放誤區

稍微使用過C語言編寫代碼的人,都應該知道堆內存申請之后是需要釋放的。但為何還這么容易出現內存泄漏問題呢?一方面,是開發人員經驗不足、意識不到位或一時疏忽導致;另一方面,是內存釋放誤區導致。很多開發人員,認為要釋放的內存應該局限于以下兩種:

(1)直接使用內存申請函數申請出來的內存,如malloc、g_malloc等; (2)該開發人員熟悉的接口中,存在內存申請的情況,如iBMC的兄弟,都應該知道調用如下接口需要釋放list指向的內存:

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

02

內存泄漏問題檢視方法

檢視內存泄漏問題,關鍵還是要養成良好的編碼檢視習慣。與內存泄漏三要素對應,需要做到如下三點:

(1)在函數中看到有局部指針,就要警惕內存泄漏問題,養成進一步排查的習慣;

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    3111

    瀏覽量

    75025
  • C代碼
    +關注

    關注

    1

    文章

    90

    瀏覽量

    14687

原文標題:從原理到方法,一文講清如何應對C語言內存泄露!

文章出處:【微信號:Huawei_Developer,微信公眾號:華為開發者社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

    使用OpenVINO?進行推理時的內存泄漏怎么解決?

    使用 OpenVINO? 進行推理時,內存會隨著時間的推移而增加,并導致程序崩潰。
    發表于 03-06 08:29

    內存泄漏檢測工具Sanitizer介紹

    內存泄漏,我們經常會遇到,如何檢測內存泄漏,除了我們之前講過的 valgrind,還可以使用 gcc 自帶的工具 sanitizer。
    的頭像 發表于 03-01 14:52 ?587次閱讀

    科普:產品密封泄漏試驗等級評定標準及方法詳解

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

    使用DevEco Studio高效解決鴻蒙原生應用內存問題

    在鴻蒙原生應用開發過程中,可能由于種種原因導致應用內存未被正常地使用或者歸還至操作系統,從而引發內存異常占用、內存泄漏等問題,最終導致應用卡頓甚至崩潰,嚴重影響用戶體驗。
    的頭像 發表于 01-16 14:44 ?634次閱讀

    免費泄漏率計算工具,讓氣密性檢測變得簡單高效

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

    虛擬內存溢出該怎么處理 虛擬內存在服務器中的應用

    、虛擬內存溢出的原因 內存泄漏 :程序中未正確釋放的內存會導致內存泄漏,隨著時間的推移,這些
    的頭像 發表于 12-04 09:49 ?726次閱讀

    什么是泄漏電流試驗?

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

    RAM內存不足的表現及解決方法

    RAM內存不足的表現及解決方法 一、RAM內存不足的表現 系統運行緩慢 當RAM內存不足時,計算機的響應速度會明顯下降,打開程序或文件需要更長的時間。 頻繁的頁面交換(Page Swa
    的頭像 發表于 11-11 09:53 ?4150次閱讀

    堆棧和內存的基本知識

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

    如何檢測內存泄漏

    檢測內存泄漏是軟件開發過程中一項至關重要的任務,它有助于識別和解決那些導致程序占用過多內存資源,從而影響程序性能甚至導致程序崩潰的問題。以下將詳細闡述幾種常見的內存
    的頭像 發表于 07-30 11:50 ?3256次閱讀

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

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

    NONOS 1.5.3/1.5.4 SSL內存泄漏的原因?

    我已經通過隨附的代碼驗證了當發生 SSL 握手錯誤時,會生成內存泄漏 此外,espconn_reconnect_callback不稱為信令ESPCONN_HANDSHAKE - TCP SSL 握手
    發表于 07-18 07:24

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

    我想使用system_show_malloc()檢查內存泄漏,但是當我調用該函數時,我得到了致命的異常: 致命異常 28 (LoadProhibitedCause): epc1
    發表于 07-10 06:32

    凱迪正大對高壓電纜泄漏與耐壓試驗方法及步驟分享

    為確保高壓電纜的性能和安全進行泄漏和耐壓試驗是必不可少的環節,本文還是依照凱迪正大的從業經驗介紹高壓電纜泄漏和耐壓試驗的方法及步驟。希望能對大家起到積極的作用,也歡迎大家留言交流討論與指正。
    的頭像 發表于 06-26 13:48 ?1043次閱讀
    主站蜘蛛池模板: 久久精品视频国产 | 成人午夜免费剧场 | 给我免费播放片黄色 | 韩国中文字幕在线观看 | 五月天狠狠| 亚洲国产欧美在线人成aaa | 国产精品青草久久 | 边做饭边被躁欧美三级小说 | 亚洲qingse中文久久网 | 性大特级毛片视频 | 美女爱爱网站 | h视频欧美| 欧美黑人性受xxxx精品 | 97天天做天天爱夜夜爽 | 国产一级做a爱免费视频 | 黄视频免费在线看 | 夜夜天天 | 亚洲专区一 | 国产精品怡红院永久免费 | 在线国产播放 | 综合爱爱 | 一区二区在线免费观看 | 在线天堂bt中文www在线 | 99成人| 亚洲午夜一区二区三区 | www.妖精视频| 91大神精品在线观看 | 在线观看免费视频 | 激情综合网激情 | 夜夜精品视频 | 黄色大片a级 | 精品亚洲成a人片在线观看 精品亚洲大全 | 伊人精品视频在线 | 亚洲三级在线看 | 亚洲婷婷综合网 | 丝袜美腿视频一区二区三区 | 午夜免费伦费影视在线观看 | 女性私密部位扒开的视频 | 久久在精品线影院精品国产 | www.色老头.com| 欧美爱爱帝国综合社区 |