色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

C語言內存泄露問題很嚴重,如何應對?

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-10-30 09:58 ? 次閱讀

1. 前言
最近部門不同產品接連出現內存泄漏導致的網上問題,具體表現為單板在現網運行數月以后,因為內存耗盡而導致單板復位現象。

一方面,內存泄漏問題屬于低級錯誤,此類問題遺漏到現網,影響很壞;另一方面,由于內存泄漏問題很可能導致單板運行固定時間以后就復位,只能通過批量升級才能解決,實際影響也很惡劣。

同時,接連出現此類問題,尤其是其中一例問題還是我們老員工修改引入,說明我們不少員工對內存泄漏問題認識還是不夠深刻的。

本文通過介紹內存泄漏問題原理及檢視方法,希望后續能夠從編碼檢視環節就杜絕此類問題發生。

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

2. 內存泄漏問題原理
2.1 堆內存在 C 代碼中的存儲方式
內存泄漏問題只有在使用堆內存的時候才會出現,棧內存不存在內存泄漏問題,因為棧內存會自動分配和釋放。

C 代碼中堆內存的申請函數是 malloc,常見的內存申請代碼如下:

左右滑動查看全部代碼>>>

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

由于 malloc 函數返回的實際上是一個內存地址,所以保存堆內存的變量一定是一個指針(除非代碼編寫極其不規范)。

再重復一遍,保存堆內存的變量一定是一個指針,這對本文主旨的理解很重要。當然,這個指針可以是單指針,也可以是多重指針。

malloc 函數有很多變種或封裝,如 g_malloc、g_malloc0、VOS_Malloc 等,這些函數最終都會調用 malloc 函數。

2.2 堆內存的獲取方法
看到本小節標題,可能有些同學有疑惑,上一小節中的 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_t;
getline (char **__lineptr, size_t *__n, FILE *__stream);
前面說通過 malloc 申請內存,就屬于方法一的一個具體表現形式。其實這兩類方法的本質是一樣的,都是函數內部間接申請了內存,只是傳遞內存的方法不一樣,方法一通過返回值傳遞內存指針,方法二通過參數傳遞內存指針。

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

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

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

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

2.4 內存釋放誤區
稍微使用過 C 語言編寫代碼的人,都應該知道堆內存申請之后是需要釋放的。但為何還這么容易出現內存泄漏問題呢?

一方面,是開發人員經驗不足、意識不到位或一時疏忽導致;另一方面,是內存釋放誤區導致。很多開發人員,認為要釋放的內存應該局限于以下兩種:

1) 直接使用內存申請函數申請出來的內存,如 malloc、g_malloc 等;

2)該開發人員熟悉的接口中,存在內存申請的情況,如 iBMC 的兄弟,都應該知道調用如下接口需要釋放 list 指向的內存:

左右滑動查看全部代碼>>>

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

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

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

2) 分析對局部指針的賦值操作,是否屬于前面所說的“兩種堆內存獲取方法”之一,如果是,就要分析函數返回的指針到底指向啥?

是全局數據、靜態數據還是堆內存?對于不熟悉的接口,要找到對應的接口文檔或源代碼分析;又或者看看代碼中其它地方對該接口的引用,是否進行了內存釋放;

3) 如果確認對局部指針存在內存申請操作,就需要分析該內存的去向,是會被保存在全局變量嗎?又或者會被作為函數返回值嗎?如果都不是,就需要排查函數所有有”return“的地方,保證內存被正確釋放。

內存泄漏是比較難查的 bug 之一?有什么查找技巧嗎?歡迎留言交流~

審核編輯 黃昊宇

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

    關注

    180

    文章

    7604

    瀏覽量

    136706
  • 內存泄露
    +關注

    關注

    0

    文章

    6

    瀏覽量

    1983
收藏 人收藏

    評論

    相關推薦

    使用TMUX1109做ADC差分同步采樣,出現了很嚴重的串擾怎么解決?

    各位工程師好!我在使用TMUX1109做ADC差分同步采樣,現在出現了很嚴重的串擾問題,我軟件是在每次通道切換完成后100us才開始采樣的,但是每個通道的波形始終有串擾,而且非常嚴重,通道不切換采樣就不會有串擾,麻煩幫我看下是不是硬件或者軟件哪里有注意事項沒考慮到。謝謝
    發表于 11-29 11:09

    使用ADS1298采集到的腦電信號,波形數據有基線漂移,還有很嚴重的信號整體波形的上移或者下移,為什么?

    官方您好,我使用ADS1298采集到的腦電信號,波形數據不僅有基線漂移,還有很嚴重的信號整體波形的上移或者下移,并且每次測試時移動的幅圖也不同,但看信號波形是比較干凈的,這個移動就是采集出來的通道
    發表于 11-14 06:33

    TPA3118按照datasheet畫的電路,結果電感發熱很嚴重,怎么解決?

    按照datasheet畫的電路,結果電感發熱很嚴重,求大神解答
    發表于 10-28 07:50

    利用TLV320AIC3256做了一個帶話筒的設備,發現嘯叫很嚴重,怎么解決?

    本公司做了一個帶話筒的設備,發現嘯叫很嚴重,不知道這個要怎么去掉,我看了一下TLV320AIC3256這個型號說有AEC回聲消除功能,不知道能不能滿足我的要求,想請問一下有沒有大神做個類似設備
    發表于 10-24 07:28

    THS4302在10M到40M之間為什么失真很嚴重,怎么解決?

    在10M到40M之間為什么失真很嚴重。 電路是按數據手冊搭的,+4V和-4V供電,輸入用50Ω到GND;輸出100Ω到GND。 接+5V和-5V供電時芯片發熱很嚴重。 不知道是不是我電路有問題?還是芯片自身的問題?
    發表于 09-24 08:02

    VCA820按照datasheet上的電路搭的,但是出來的波形很粗,自激現象很嚴重怎么解決?

    按照datasheet上的電路搭的,但是出來的波形很粗,自激現象很嚴重 急求幫助啊!!!
    發表于 09-18 08:50

    ISO124U發熱很嚴重是怎么回事?

    我電路用的是ISO124U,原邊供電電壓±12V,副邊供電電壓±15V。芯片工作時輸入電壓+7V,輸出電壓+7V正常,但是芯片發熱很嚴重,通電半分鐘芯片就比較燙了,功耗也很明顯,不知道這種情況是否正常,該正常工作時發熱很嚴重嗎?我不知道是不是我的芯片有問題?求解啊,謝
    發表于 09-12 07:23

    使用哪種運放比較適合做衰減用,且不會失真很嚴重

    您好:我想用運放做衰減用,輸入信號的幅度為0~10V,衰減5倍左右。輸入信號的頻率為135H和15Hz組成的正弦波包絡。 請問,使用哪種運放比較適合做衰減用,且不會失真很嚴重,謝謝!
    發表于 09-10 07:20

    THS3202使用的時候發燙很嚴重,為什么?

    THS3202使用的時候發燙很嚴重
    發表于 09-02 08:04

    E類功放與線圈實現無線供電傳輸,MOS管發熱很嚴重的原因?

    最近在研究E類功放,采用E類功放與線圈實現無線供電傳輸。 但是這個E類功放部分,MOS管發熱很嚴重,應該是輸出端阻抗匹配的問題,請教一下給位。 (MOS管用的是CSD16322Q5,驅動管用的是UCC27517A)
    發表于 09-02 06:37

    INA128放大小信號抖動很嚴重怎么解決?

    怎樣解決放大器放大小信號都懂很嚴重的問題?或則有沒有哪種儀表運放放大微弱信號抖動不會很嚴重
    發表于 08-23 08:24

    TL3016輸入正弦波的頻率超過20MHz時,輸出波形出現很嚴重的振蕩怎么解決?

    當輸入正弦波的頻率超過20MHz 時,輸出波形出現很嚴重的振蕩,原理圖如下
    發表于 08-07 07:02

    C語言內存泄漏問題原理

    內存泄漏問題只有在使用堆內存的時候才會出現,棧內存不存在內存泄漏問題,因為棧內存會自動分配和釋放。C
    發表于 03-19 11:38 ?521次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內存</b>泄漏問題原理

    Z450-4A的500KW直流電機換向器打火很嚴重是什么原因導致的呢?

    有一臺Z450-4A的500KW直流電機,最近出現了很奇怪的現象,換向器打火很嚴重,換向器出現下面圖片上的跡象,間隔著有打火的現象。已經對碳刷全部更換,用砂紙對換向器進行了打磨,處理后依然是打火嚴重
    發表于 01-09 06:39

    PT斷線是什么?為什么說PT斷線影響很嚴重

    PT斷線是什么?為什么說PT斷線影響很嚴重? PT斷線是指電壓互感器的一種故障狀態,即PT缺乏或中斷了電壓信號的傳輸。PT作為一種重要的電氣元件,主要用于將高壓系統的電壓降到安全范圍內,以供電力儀表
    的頭像 發表于 12-26 16:01 ?3132次閱讀
    主站蜘蛛池模板: 沙发上小泬12P| 男女牲交全过程免费播放| 好爽别插了无码视频| 国内久经典AAAAA片| 久久国产乱子伦精品免费不卡 | 国产人成高清在线视频99| 国产精品青青在线麻豆| 果冻传媒2021精品影视| 快穿之诱受双性被灌满h| 欧美一级情欲片在线| 窝窝色资源站| 一攻多受h嗯啊巨肉bl巨污| 99re10久久热| 国产成人综合视频| 精品无码乱码AV| 欧美乱妇日本无乱码特黄大片| 入禽太深免费视频10| 亚洲免费在线| 99在线观看精品| 国产91综合| 久久re6热在线视频精品66| 人妻中文字幕无码系列| 亚洲理论片在线中文字幕| 91天仙tv嫩模福利| 国产免费人成在线视频有码| 久久婷婷色香五月综合激情| 青青伊人久久| 亚洲二区电影| ae58老司机福利| 國產日韓亞洲精品AV| 欧美日韩亚洲第一区在线| 鞋奴的视频VK| 99er热精品视频国产免费| 国产精品久久久久久精品...| 久久中文字幕乱码免费| 少爷被多个暗卫肉高h| 长篇高h肉爽文丝袜| 国产精品欧美亚洲| 嗯啊哈啊好棒用力插啊| 亚洲AV国产福利精品在现观看| a视频在线免费观看|