日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 嵌入式微處理器
[導讀]1.前言 最近部門不同產(chǎn)品接連出現(xiàn)內(nèi)存泄漏導致的網(wǎng)上問題,具體表現(xiàn)為單板在現(xiàn)網(wǎng)運行數(shù)月以后,因為內(nèi)存耗盡而導致單板復位現(xiàn)象。 一方面,內(nèi)存泄漏問題屬于低級錯誤,此類問題遺漏到現(xiàn)網(wǎng),影響很壞;另一方面,由于內(nèi)存泄漏問題很可能導致單板運行固定時間以



1.前言

最近部門不同產(chǎn)品接連出現(xiàn)內(nèi)存泄漏導致的網(wǎng)上問題,具體表現(xiàn)為單板在現(xiàn)網(wǎng)運行數(shù)月以后,因為內(nèi)存耗盡而導致單板復位現(xiàn)象。

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

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

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

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

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

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

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

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

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

看到本小節(jié)標題,可能有些同學有疑惑,上一小節(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; /**轉換后的字符串**/ ret = (char*)function_xx(..., &local_pointer_xx, ...);


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

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

__STDIO_INLINE _IO_ssize_t;
getline (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)存指針。

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

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

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

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

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

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

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

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

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

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

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

dfl_get_object_list(const char* class_name, GSList **list);

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

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

檢視內(nèi)存泄漏問題,關鍵還是要養(yǎng)成良好的編碼檢視習慣。與內(nèi)存泄漏三要素對應,需

要做到如下三點:

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

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

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

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


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

-END-


來源 :https://blog.csdn.net/devcloud/article/details/108335912




推薦閱讀



【01】怎么學習單片機外圍器件?

【02】漫畫版:如何學習單片機?

【03】單片機:3種時鐘電路方案對比,你常用哪一種?

【04】單片機編程技術學習攻略

【05】國產(chǎn)超低價單片機五宗罪!“扶不起”的原因就是它們?


免責聲明:整理文章為傳播相關技術,版權歸原作者所有,如有侵權,請聯(lián)系刪除

免責聲明:本文內(nèi)容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關鍵。

關鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅(qū)動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關鍵字: LED 驅(qū)動電源 開關電源

LED驅(qū)動電源是把電源供應轉換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅(qū)動電源
關閉