91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

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

01

內存泄漏問題原理

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

內存泄漏問題只有在使用堆內存的時候才會出現(xiàn),棧內存不存在內存泄漏問題,因為棧內存會自動分配和釋放。C代碼中堆內存的申請函數(shù)是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函數(shù)返回的實際上是一個內存地址,所以保存堆內存的變量一定是一個指針(除非代碼編寫極其不規(guī)范)。再重復一遍,保存堆內存的變量一定是一個指針,這對本文主旨的理解很重要。當然,這個指針可以是單指針,也可以是多重指針。 malloc函數(shù)有很多變種或封裝,如g_malloc、g_malloc0、VOS_Malloc等,這些函數(shù)最終都會調用malloc函數(shù)。

堆內存的獲取方法

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

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

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

GSList* g_slist_append (GSList *list, gpointer data)

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

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

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

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

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

內存泄漏三要素

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

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

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

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

內存釋放誤區(qū)

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

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

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

02

內存泄漏問題檢視方法

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

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

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

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

    關注

    9

    文章

    3211

    瀏覽量

    76380
  • C代碼
    +關注

    關注

    1

    文章

    90

    瀏覽量

    15192

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    MangoTree Halo Ultra「全新PXI」,標配自動糾錯內存#

    內存
    芒果樹數(shù)字
    發(fā)布于 :2026年03月06日 15:59:34

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

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

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

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

    WebGL/Canvas 內存泄露分析

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

    at_device 包 ml307長時間運行有內存泄漏問題怎么解決?

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

    產品密封性防水泄漏標準如何判定?精誠工科氣密性檢測儀的設置方法

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

    如何通過PinView檢查I/O電流泄漏

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

    在OpenVINO? C++代碼中啟用 AddressSanitizer 時的內存泄漏怎么解決?

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

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

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

    HarmonyOS優(yōu)化應用內存占用問題性能優(yōu)化一

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

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

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

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

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

    推薦兩款菲力爾氣體泄漏檢測神器

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

    快速搞懂C語言程序內存分區(qū)!

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