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

c語(yǔ)言內(nèi)存泄漏嚴(yán)重的解決方法

 更新時(shí)間:2020年09月01日 11:32:27   作者:華為云開(kāi)發(fā)者社區(qū)  
這篇文章主要介紹了c語(yǔ)言內(nèi)存泄漏的解決方法,幫助大家更好的理解和使用c語(yǔ)言開(kāi)發(fā),感興趣的朋友可以了解下

摘要:通過(guò)介紹內(nèi)存泄漏問(wèn)題原理及檢視方法,希望后續(xù)能夠從編碼檢視環(huán)節(jié)就杜絕內(nèi)存泄漏導(dǎo)致的網(wǎng)上問(wèn)題發(fā)生。

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ò)誤,此類問(wèn)題遺漏到現(xiàn)網(wǎng),影響很壞;另一方面,由于內(nèi)存泄漏問(wèn)題很可能導(dǎo)致單板運(yùn)行固定時(shí)間以后就復(fù)位,只能通過(guò)批量升級(jí)才能解決,實(shí)際影響也很惡劣。同時(shí),接連出現(xiàn)此類問(wèn)題,尤其是其中一例問(wèn)題還是我們老員工修改引入,說(shuō)明我們不少員工對(duì)內(nèi)存泄漏問(wèn)題認(rèn)識(shí)還是不夠深刻的。本文通過(guò)介紹內(nèi)存泄漏問(wèn)題原理及檢視方法,希望后續(xù)能夠從編碼檢視環(huán)節(jié)就杜絕此類問(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)代碼如下:

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)形式如下:

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

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

GSList* g_slist_append (GSList  *list, gpointer data)

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

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

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

__STDIO_INLINE _IO_ssize_t
getline (char **__lineptr, size_t *__n, FILE *__stream)

前面說(shuō)通過(guò)malloc申請(qǐng)內(nèi)存,就屬于方法一的一個(gè)具體表現(xiàn)形式。其實(shí)這兩類方法的本質(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)存:

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

以上就是c語(yǔ)言內(nèi)存泄漏嚴(yán)重的解決方法的詳細(xì)內(nèi)容,更多關(guān)于c語(yǔ)言內(nèi)存泄漏的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 用C/C++代碼檢測(cè)ip能否ping通(配合awk和system可以做到批量檢測(cè))

    用C/C++代碼檢測(cè)ip能否ping通(配合awk和system可以做到批量檢測(cè))

    今天小編就為大家分享一篇關(guān)于用C/C++代碼檢測(cè)ip能否ping通(配合awk和system可以做到批量檢測(cè)),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • 詳解安卓系統(tǒng)中的Android.mk文件

    詳解安卓系統(tǒng)中的Android.mk文件

    這篇文章主要介紹了詳解安卓系統(tǒng)中的Android.mk文件,該文件用來(lái)告訴系統(tǒng)關(guān)于源代碼的編譯,需要的朋友可以參考下
    2015-07-07
  • Qt實(shí)現(xiàn)導(dǎo)出QTableWidget/QTableView數(shù)據(jù)

    Qt實(shí)現(xiàn)導(dǎo)出QTableWidget/QTableView數(shù)據(jù)

    這篇文章主要介紹了在Qt中實(shí)現(xiàn)將QTableWidget或者QTableView中的數(shù)據(jù)直接導(dǎo)出的示例代碼,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-01-01
  • C語(yǔ)言 位運(yùn)算詳解及示例代碼

    C語(yǔ)言 位運(yùn)算詳解及示例代碼

    本文主要介紹C語(yǔ)言 位運(yùn)算的基礎(chǔ)知識(shí),這里整理了相關(guān)資料及示例代碼,有興趣的小伙伴可以參考下
    2016-08-08
  • Qt6.0開(kāi)發(fā)環(huán)境搭建步驟(圖文)

    Qt6.0開(kāi)發(fā)環(huán)境搭建步驟(圖文)

    這篇文章主要介紹了Qt6.0開(kāi)發(fā)環(huán)境搭建步驟(圖文),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++利用用埃式篩法求解素?cái)?shù)

    C++利用用埃式篩法求解素?cái)?shù)

    埃拉托斯特尼篩法,簡(jiǎn)稱埃氏篩或愛(ài)氏篩,是一種由希臘數(shù)學(xué)家埃拉托斯特尼所提出的一種簡(jiǎn)單檢定素?cái)?shù)的算法。本文將利用這一算法實(shí)現(xiàn)求解素?cái)?shù),感興趣的可以了解一下
    2023-01-01
  • C++時(shí)間戳轉(zhuǎn)化操作實(shí)例分析【涉及GMT與CST時(shí)區(qū)轉(zhuǎn)化】

    C++時(shí)間戳轉(zhuǎn)化操作實(shí)例分析【涉及GMT與CST時(shí)區(qū)轉(zhuǎn)化】

    這篇文章主要介紹了C++時(shí)間戳轉(zhuǎn)化操作,結(jié)合實(shí)例形式分析了C++時(shí)間戳轉(zhuǎn)換與顯示操作的原理與具體實(shí)現(xiàn)技巧,涉及GMT與CST時(shí)區(qū)轉(zhuǎn)化,需要的朋友可以參考下
    2017-05-05
  • 詳解C++?中?shared_ptr?weak_ptr

    詳解C++?中?shared_ptr?weak_ptr

    shared_ptr?是一個(gè)標(biāo)準(zhǔn)的共享所有權(quán)的智能指針,允許多個(gè)指針指向同一個(gè)對(duì)象,定義在?memory?文件中,命名空間為?std,這篇文章主要介紹了C++?中?shared_ptr?weak_ptr,需要的朋友可以參考下
    2022-07-07
  • C++?Boost?ProgramOptions超詳細(xì)講解

    C++?Boost?ProgramOptions超詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • C++類的靜態(tài)成員初始化詳細(xì)講解

    C++類的靜態(tài)成員初始化詳細(xì)講解

    通常靜態(tài)數(shù)據(jù)成員在類聲明中聲明,在包含類方法的文件中初始化.初始化時(shí)使用作用域操作符來(lái)指出靜態(tài)成員所屬的類.但如果靜態(tài)成員是整型或是枚舉型const,則可以在類聲明中初始化
    2013-09-09

最新評(píng)論

焉耆| 内江市| 页游| 屏东市| 威远县| 舒兰市| 太原市| 夏邑县| 化德县| 邵武市| 化州市| 涟源市| 五指山市| 彩票| 汉川市| 措勤县| 巴林左旗| 吕梁市| 凤台县| 贺州市| 望谟县| 丰宁| 资阳市| 青川县| 全椒县| 浮梁县| 乐安县| 科技| 天全县| 依兰县| 旬阳县| 清流县| 城市| 蒙山县| 郴州市| 寿阳县| 庆安县| 夹江县| 屯留县| 浦江县| 德昌县|