哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

完善資料讓更多小伙伴認(rèn)識你,還能領(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)運行數(shù)月以后,因為內(nèi)存耗盡而導(dǎo)致單板復(fù)位現(xiàn)象。一方面,內(nèi)存泄漏問題屬于比較淺顯的錯誤,此類問題遺漏到現(xiàn)網(wǎng),影響不好;另一方面,由于內(nèi)存泄漏問題很可能導(dǎo)致單板運行固定時間以后就復(fù)位,只能通過批量升級才能解決,實際影響不佳。本文通過介紹內(nèi)存泄漏問題原理及檢視方法,希望后續(xù)能夠從編碼檢視環(huán)節(jié)就杜絕此類問題發(fā)生。

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

01

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

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

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

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

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

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

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

該類涉及到內(nèi)存申請的函數(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)存申請的函數(shù),一般都有一個入?yún)⑹请p重指針,例如:

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

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

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

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

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

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

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

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

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

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

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

02

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

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

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

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

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

    關(guān)注

    9

    文章

    3224

    瀏覽量

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

    關(guān)注

    1

    文章

    90

    瀏覽量

    15220

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    運行測試程序以讀取通過受信任應(yīng)用程序 (TA) 存儲的安全 blob 時,內(nèi)存不足怎么解決?

    使用給定密鑰解密其中一些密鑰。 它發(fā)生在執(zhí)行至少 15 分鐘后,TA 和 tee-os 沒有錯誤日志(僅出現(xiàn)調(diào)試消息)。 我最初懷疑它來自內(nèi)存泄漏,但由于缺乏來自 TA 和 tee-os 的錯誤消息,它
    發(fā)表于 04-10 10:52

    DDR5內(nèi)存斷崖式下跌或引發(fā)踩踏式拋貨?

    內(nèi)存
    芯廣場
    發(fā)布于 :2026年03月30日 15:35:23

    一次內(nèi)存泄漏排查復(fù)盤

    的日志采集和邊車也跟著抖?,F(xiàn)場最容易犯的錯是看到內(nèi)存高就先重啟,或者只看 free -h 就把鍋甩給 page cache。這樣做能把告警按掉,但根因還在,第二波流量一來還會復(fù)發(fā)。
    的頭像 發(fā)表于 03-11 09:52 ?386次閱讀

    MangoTree Halo Ultra「全新PXI」,標(biāo)配自動糾錯內(nèi)存#

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    一、閥門的泄漏等級想象一下,一座化工廠的關(guān)鍵管道上,一個微小的閥門泄漏可能造成數(shù)百萬的損失甚至安全事故。這就是為什么閥門泄漏等級成為工業(yè)界的「生命線」。閥門的泄漏等級是衡量閥門關(guān)閉嚴(yán)密
    的頭像 發(fā)表于 04-16 11:34 ?5123次閱讀
    快問快答:<b class='flag-5'>泄漏</b>等級有哪些?含閥門氣密性檢測原理<b class='flag-5'>方法</b>和解決方案
    仁化县| 南木林县| 峨边| 玛多县| 定西市| 宣恩县| 通河县| 赞皇县| 简阳市| 涞水县| 沙洋县| 博乐市| 沁阳市| 会宁县| 肇东市| 邵阳市| 收藏| 宁阳县| 曲阳县| 滨海县| 广元市| 正定县| 炎陵县| 甘孜县| 德令哈市| 洪洞县| 武平县| 绥宁县| 彭山县| 瑞丽市| 银川市| 延边| 四子王旗| 龙岩市| 宁化县| 洛宁县| 渑池县| 东源县| 大冶市| 岑溪市| 西平县|