18video性欧美19sex,欧美高清videosddfsexhd,性少妇videosexfreexxx片中国,激情五月激情综合五月看花,亚洲人成网77777色在线播放

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言?xún)?nèi)存泄露問(wèn)題很?chē)?yán)重,如何應(yīng)對(duì)?

電子設(shè)計(jì) ? 來(lái)源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2020-10-30 09:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. 前言
最近部門(mén)不同產(chǎn)品接連出現(xiàn)內(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)題屬于低級(jí)錯(cuò)誤,此類(lèi)問(wèn)題遺漏到現(xiàn)網(wǎng),影響很壞;另一方面,由于內(nèi)存泄漏問(wèn)題很可能導(dǎo)致單板運(yùn)行固定時(shí)間以后就復(fù)位,只能通過(guò)批量升級(jí)才能解決,實(shí)際影響也很惡劣。

同時(shí),接連出現(xiàn)此類(lèi)問(wèn)題,尤其是其中一例問(wèn)題還是我們老員工修改引入,說(shuō)明我們不少員工對(duì)內(nèi)存泄漏問(wèn)題認(rèn)識(shí)還是不夠深刻的。

本文通過(guò)介紹內(nèi)存泄漏問(wèn)題原理及檢視方法,希望后續(xù)能夠從編碼檢視環(huán)節(jié)就杜絕此類(lèi)問(wèn)題發(fā)生。

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

2. 內(nèi)存泄漏問(wèn)題原理
2.1 堆內(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,常見(jiàn)的內(nèi)存申請(qǐng)代碼如下:

左右滑動(dòng)查看全部代碼>>>

char *info = NULL; /**轉(zhuǎn)換后的字符串**/
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 函數(shù)返回的實(shí)際上是一個(gè)內(nèi)存地址,所以保存堆內(nèi)存的變量一定是一個(gè)指針(除非代碼編寫(xiě)極其不規(guī)范)。

再重復(fù)一遍,保存堆內(nèi)存的變量一定是一個(gè)指針,這對(duì)本文主旨的理解很重要。當(dāng)然,這個(gè)指針可以是單指針,也可以是多重指針。

malloc 函數(shù)有很多變種或封裝,如 g_malloc、g_malloc0、VOS_Malloc 等,這些函數(shù)最終都會(huì)調(diào)用 malloc 函數(shù)。

2.2 堆內(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)形式如下:

左右滑動(dòng)查看全部代碼>>>

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


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

左右滑動(dòng)查看全部代碼>>>

GSList* g_slist_append (GSList *list, gpointer data);


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

左右滑動(dòng)查看全部代碼>>>

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


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

左右滑動(dòng)查看全部代碼>>>

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

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

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

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

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

2.4 內(nèi)存釋放誤區(qū)
稍微使用過(guò) C 語(yǔ)言編寫(xiě)代碼的人,都應(yīng)該知道堆內(nèi)存申請(qǐng)之后是需要釋放的。但為何還這么容易出現(xiàn)內(nèi)存泄漏問(wèn)題呢?

一方面,是開(kāi)發(fā)人員經(jīng)驗(yàn)不足、意識(shí)不到位或一時(shí)疏忽導(dǎo)致;另一方面,是內(nèi)存釋放誤區(qū)導(dǎo)致。很多開(kāi)發(fā)人員,認(rèn)為要釋放的內(nèi)存應(yīng)該局限于以下兩種:

1) 直接使用內(nèi)存申請(qǐng)函數(shù)申請(qǐng)出來(lái)的內(nèi)存,如 malloc、g_malloc 等;

2)該開(kāi)發(fā)人員熟悉的接口中,存在內(nèi)存申請(qǐng)的情況,如 iBMC 的兄弟,都應(yīng)該知道調(diào)用如下接口需要釋放 list 指向的內(nèi)存:

左右滑動(dòng)查看全部代碼>>>

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

3. 內(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)存被正確釋放。

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

審核編輯 黃昊宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    183

    文章

    7634

    瀏覽量

    144138
  • 內(nèi)存泄露
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    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)性的課題。 開(kāi)發(fā)者通常面臨的內(nèi)存泄漏問(wèn)題,其根源遠(yuǎn)比簡(jiǎn)單
    的頭像 發(fā)表于 10-21 11:40 ?44次閱讀
    WebGL/Canvas <b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄露</b>分析

    STM32+DP83848跑10M可以,100M丟包很?chē)?yán)重,請(qǐng)問(wèn)有人遇到過(guò)嗎?

    大佬們,stm32驅(qū)動(dòng)dp83848,跑10M可以,100M丟包很?chē)?yán)重,請(qǐng)問(wèn)有人遇到過(guò)嗎
    發(fā)表于 08-20 10:04

    mpu6050航向角漂移很?chē)?yán)重的原因及解決方法

    mpu6050航向角漂移很?chē)?yán)重的原因及解決方案
    的頭像 發(fā)表于 03-01 11:47 ?3706次閱讀

    使用ADS1298采集的心電信號(hào)已經(jīng)可以顯示出來(lái),只要測(cè)試時(shí)呼吸咳嗽時(shí)心電的基線漂移會(huì)很?chē)?yán)重,如何解決?

    使用ADS1298采集的心電信號(hào)已經(jīng)可以顯示出來(lái),但是只要測(cè)試時(shí)呼吸咳嗽時(shí) 心電的基線漂移會(huì)很?chē)?yán)重,另外會(huì)有50hz的工頻干擾請(qǐng)問(wèn)如何解決這些問(wèn)題
    發(fā)表于 02-13 06:33

    ADS1298在采集心電信號(hào)時(shí)出現(xiàn)了很?chē)?yán)重的工頻干擾,每個(gè)通道都有,而且相對(duì)于心電信號(hào)來(lái)說(shuō)非常大,怎么解決?

    在采集心電信號(hào)時(shí)出現(xiàn)了很?chē)?yán)重的工頻干擾,每個(gè)通道都有,而且相對(duì)于心電信號(hào)來(lái)說(shuō)非常大,心電信號(hào)幾乎埋沒(méi)了。求如何解決這個(gè)問(wèn)題
    發(fā)表于 02-12 08:37

    ADS1292采集到的信號(hào)的波形,50Hz的干擾很?chē)?yán)重怎么解決?

    ADS1292采集到的信號(hào)的波形如下: 但是50Hz的干擾很?chē)?yán)重,已經(jīng)加了右腿驅(qū)動(dòng)了,還能看到明顯的干擾。 請(qǐng)問(wèn)如何把這個(gè)干擾濾除? 是需要采集之后做數(shù)字濾波嗎?有沒(méi)有數(shù)字濾波的算法供參考一下?
    發(fā)表于 02-05 08:05

    【高手問(wèn)答】電路的功能是為了0.6v到40v之間調(diào)壓,運(yùn)放發(fā)熱嚴(yán)重

    電路的功能是為了0.6v到40v之間調(diào)壓。芯片的工作電壓為38v,工作過(guò)程中運(yùn)放發(fā)熱很?chē)?yán)重。型號(hào):TPA1882-SR。求大佬答疑
    發(fā)表于 12-10 10:56

    使用TMUX1109做ADC差分同步采樣,出現(xiàn)了很?chē)?yán)重的串?dāng)_怎么解決?

    各位工程師好!我在使用TMUX1109做ADC差分同步采樣,現(xiàn)在出現(xiàn)了很?chē)?yán)重的串?dāng)_問(wèn)題,我軟件是在每次通道切換完成后100us才開(kāi)始采樣的,但是每個(gè)通道的波形始終有串?dāng)_,而且非常嚴(yán)重,通道不切換采樣就不會(huì)有串?dāng)_,麻煩幫我看下是不是硬件或者軟件哪里有注意事項(xiàng)沒(méi)考慮到。謝謝
    發(fā)表于 11-29 11:09

    DAC7750發(fā)熱很?chē)?yán)重是什么原因?qū)е碌模?/a>

    DAC7750IPWPR在20mA輸出的時(shí)候發(fā)熱非常嚴(yán)重,室溫不到30度的情況下會(huì)達(dá)到60攝氏度,這樣必須加外部散熱了。 是不是軟件哪里設(shè)置有問(wèn)題還是硬件設(shè)計(jì)導(dǎo)致的。帶上負(fù)載后用熱成像觀察,也只有芯片這個(gè)點(diǎn)嚴(yán)重發(fā)熱。
    發(fā)表于 11-28 06:14

    解讀版|Air780E軟件中C語(yǔ)言內(nèi)存數(shù)組的神秘面紗!

    今天我們來(lái)揭開(kāi)Air780E 軟件中 C 語(yǔ)言內(nèi)存數(shù)組的神秘面紗,希望有所收獲。
    的頭像 發(fā)表于 11-17 10:00 ?837次閱讀
    解讀版|Air780E軟件中<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>內(nèi)存</b>數(shù)組的神秘面紗!

    使用ADS1298采集到的腦電信號(hào),波形數(shù)據(jù)有基線漂移,還有很?chē)?yán)重的信號(hào)整體波形的上移或者下移,為什么?

    官方您好,我使用ADS1298采集到的腦電信號(hào),波形數(shù)據(jù)不僅有基線漂移,還有很?chē)?yán)重的信號(hào)整體波形的上移或者下移,并且每次測(cè)試時(shí)移動(dòng)的幅圖也不同,但看信號(hào)波形是比較干凈的,這個(gè)移動(dòng)就是采集出來(lái)的通道
    發(fā)表于 11-14 06:33

    ubuntu ping 開(kāi)發(fā)板存在嚴(yán)重的丟包情況,請(qǐng)問(wèn)該怎么解決?

    我現(xiàn)在在學(xué)習(xí)一個(gè)嵌入式Linux的項(xiàng)目,要實(shí)現(xiàn)主機(jī),虛擬機(jī),開(kāi)發(fā)板三者的通信,我的一系列設(shè)置應(yīng)該是沒(méi)問(wèn)題的。但是在ubuntu上ping開(kāi)發(fā)板時(shí)總是會(huì)出現(xiàn)很?chē)?yán)重的丟包情況,有時(shí)甚至?xí)蠪rom
    發(fā)表于 11-01 16:50

    PCM5102過(guò)載的時(shí)候爆音嚴(yán)重怎么解決?

    些時(shí)會(huì)有很?chē)?yán)重的爆音,測(cè)試PCM5102模擬輸出發(fā)現(xiàn)多了很多雜波,模擬信號(hào)的輸出音量達(dá)到PCM5102的最大輸出音量。懷疑是過(guò)載了。但是產(chǎn)品要求在電腦是最大音量時(shí)也能正常工作。特別是現(xiàn)在的藍(lán)光機(jī)的光纖同軸信號(hào)大都不可以調(diào)節(jié)音量。那該怎么解決這個(gè)問(wèn)題呢? 求指點(diǎn),謝謝!
    發(fā)表于 10-31 07:37

    C語(yǔ)言與Java語(yǔ)言的對(duì)比

    C語(yǔ)言和Java語(yǔ)言都是當(dāng)前編程領(lǐng)域中的重要成員,它們各自具有獨(dú)特的優(yōu)勢(shì)和特點(diǎn),適用于不同的應(yīng)用場(chǎng)景。以下將從語(yǔ)法特性、內(nèi)存管理、跨平臺(tái)性、性能、應(yīng)用領(lǐng)域等多個(gè)方面對(duì)
    的頭像 發(fā)表于 10-29 17:31 ?1630次閱讀

    TPA3118按照datasheet畫(huà)的電路,結(jié)果電感發(fā)熱很?chē)?yán)重,怎么解決?

    按照datasheet畫(huà)的電路,結(jié)果電感發(fā)熱很?chē)?yán)重,求大神解答
    發(fā)表于 10-28 07:50