最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言內(nèi)存泄露很嚴(yán)重的解決方案

 更新時間:2022年05月12日 09:20:54   作者:? 編程學(xué)習(xí)網(wǎng)?  ?  
這篇文章主要介紹了C語言內(nèi)存泄露很嚴(yán)重的解決方案,預(yù)防內(nèi)存泄漏問題有多種方法,比如加強(qiáng)代碼檢視、工具檢測和內(nèi)存測試等,下面文章總結(jié)內(nèi)容需要的小伙伴可以參考一下

1.前言

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

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

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

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

說明:預(yù)防內(nèi)存泄漏問題有多種方法,比如加強(qiáng)代碼檢視、工具檢測和內(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;    /**轉(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ù)返回的實際上是一個內(nèi)存地址,所以保存堆內(nèi)存的變量一定是一個指針(除非代碼編寫極其不規(guī)范)。

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

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

2.2堆內(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_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語言編寫代碼的人,都應(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)生了。

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

到此這篇關(guān)于C語言內(nèi)存泄露很嚴(yán)重的解決方案的文章就介紹到這了,更多相關(guān)C語言內(nèi)存泄露內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++獲取本機(jī)MAC,IP,MASK地址的方法

    C++獲取本機(jī)MAC,IP,MASK地址的方法

    這篇文章主要介紹了C++獲取本機(jī)MAC,IP,MASK地址的方法,主要通過IPHLPAPI.lib調(diào)用相關(guān)函數(shù)實現(xiàn)該功能,是非常實用的技巧,需要的朋友可以參考下
    2014-10-10
  • 獲取一個文件行數(shù)的方法

    獲取一個文件行數(shù)的方法

    獲取一個文件行數(shù)的方法,需要的朋友可以參考一下
    2013-03-03
  • ReSharper 的安裝使用詳細(xì)教程

    ReSharper 的安裝使用詳細(xì)教程

    resharper安裝教程是關(guān)于vs2012一個非常好用的插件的安裝教程,建議大家嘗試安裝,今天通過本教程幫助大家學(xué)習(xí)ReSharper 的安裝使用詳細(xì)教程,感興趣的朋友一起看看吧
    2021-06-06
  • 基于C語言實現(xiàn)的aes256加密算法示例

    基于C語言實現(xiàn)的aes256加密算法示例

    這篇文章主要介紹了基于C語言實現(xiàn)的aes256加密算法,結(jié)合具體實例形式詳細(xì)分析了C語言實現(xiàn)的aes256加密算法實現(xiàn)步驟與使用技巧,需要的朋友可以參考下
    2017-02-02
  • C語言使用鏈表實現(xiàn)學(xué)生籍貫管理系統(tǒng)

    C語言使用鏈表實現(xiàn)學(xué)生籍貫管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言使用鏈表實現(xiàn)學(xué)生籍貫管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • c語言之char*和unsigned?char*的區(qū)別及說明

    c語言之char*和unsigned?char*的區(qū)別及說明

    這篇文章主要介紹了c語言之char*和unsigned?char*的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++ 實現(xiàn)哈希表的實例

    C++ 實現(xiàn)哈希表的實例

    這篇文章主要介紹了C++ 實現(xiàn)哈希表的實例的相關(guān)資料,這里使用C++實現(xiàn)哈希表的實例幫助大家徹底理解哈希表的原理,需要的朋友可以參考下
    2017-08-08
  • C語言編程中統(tǒng)計輸入的行數(shù)以及單詞個數(shù)的方法

    C語言編程中統(tǒng)計輸入的行數(shù)以及單詞個數(shù)的方法

    這篇文章主要介紹了C語言編程中統(tǒng)計輸入的行數(shù)以及單詞個數(shù)的方法,利用最基礎(chǔ)的循環(huán)和判斷語句寫成,需要的朋友可以參考下
    2015-11-11
  • 基于C語言實現(xiàn)迷宮游戲的示例代碼

    基于C語言實現(xiàn)迷宮游戲的示例代碼

    這篇文章主要介紹了基于C語言如何實現(xiàn)簡單的迷宮游戲,對于學(xué)習(xí)游戲開發(fā)的朋友相信有一定的借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 圖文詳解c/c++中的多級指針與多維數(shù)組

    圖文詳解c/c++中的多級指針與多維數(shù)組

    多維數(shù)組與多級指針是初學(xué)者經(jīng)常感覺迷糊的一個地方。超過二維的數(shù)組和超過二級的指針其實并不多用。但只要掌握一定的方法,理解多級指針和“多維”數(shù)組完全可以像理解一級指針和一維數(shù)組那樣簡單。
    2016-08-08

最新評論

巴林右旗| 千阳县| 康平县| 新邵县| 彰武县| 吕梁市| 依安县| 北宁市| 容城县| 措勤县| 赤水市| 田林县| 乡城县| 肥东县| 社会| 尉犁县| 措勤县| 新邵县| 巴彦县| 吉木乃县| 崇信县| 桃园县| 巧家县| 建湖县| 旬阳县| 增城市| 六安市| 昌黎县| 惠来县| 嘉兴市| 曲周县| 尉氏县| 海兴县| 三门峡市| 扬州市| 惠来县| 靖边县| 武汉市| 永川市| 太白县| 房山区|