內(nèi)存泄漏的原理
只有在堆內(nèi)存里面才會發(fā)生內(nèi)存泄漏的問題,在棧內(nèi)存中不會發(fā)生內(nèi)存泄漏。因?yàn)闂?nèi)存在自動分配空間之后,還會自動釋放空間。
什么是堆內(nèi)存?存儲方式是什么樣的呢?
首先我們先來介紹一下堆內(nèi)存在C代碼中的存儲方式。C代碼中動態(tài)申請堆內(nèi)存的申請函數(shù)是malloc,常見的內(nèi)存代碼如下圖所示:
因?yàn)閙alloc函數(shù)返回值是一個內(nèi)存地址,所以保存堆內(nèi)存的變量一定得是一個指針,當(dāng)然這個變量可以是一個單指針,也可以是一個多重指針。
如何獲取堆內(nèi)存?
對于堆內(nèi)存的獲取方法,我們可以有兩種方法,第一種是用返回值傳遞內(nèi)存指針,第二種方法是通過參數(shù)傳遞給內(nèi)存指針。上面我們用到的malloc申請內(nèi)存,就是屬于方法一的一種具體表現(xiàn)形式,是直接把返回值傳遞給內(nèi)存指針。
方法一:把函數(shù)返回值直接賦值給指針,一般表現(xiàn)形式如下:
方法二:將指針地址作為函數(shù)返回參數(shù),通過返回參數(shù)保存堆內(nèi)存地址,一般表現(xiàn)形式如下:
總結(jié):這兩類方法的本質(zhì)是一樣的,都是函數(shù)內(nèi)存間接申請了內(nèi)存,但是只有傳遞內(nèi)存的方法不一樣,方法一是通過返回值傳遞內(nèi)存指針,方法二是通過參數(shù)傳遞內(nèi)存指針。
內(nèi)存泄漏的三個原因
當(dāng)我們的代碼出現(xiàn)內(nèi)存泄漏的時候,一般都會包含以下幾個原因:1、函數(shù)內(nèi)有局部指針變量定義;2、對該局部指針有獲取內(nèi)存的操作;3、在函數(shù)返回前沒有釋放該內(nèi)存,也未保存到其他全局變量或返回上一級函數(shù)。
如何檢查內(nèi)存泄漏
為了避免檢查內(nèi)存泄漏,我們還是要養(yǎng)成良好的編碼習(xí)慣。當(dāng)我們要進(jìn)行檢查內(nèi)存泄漏問題的時候,一般要做到以下三點(diǎn):
(1)當(dāng)我們在函數(shù)中看到有局部指針的時候,一定要仔細(xì)檢查是否有存泄漏的問題發(fā)生,養(yǎng)成仔細(xì)檢查的習(xí)慣;
(2)如果有局部變量,并且有對局部變量賦值的操作,要檢查函數(shù)的返回的指針到底是指向什么?是全局變量、靜態(tài)數(shù)據(jù)還是堆內(nèi)存?如果代碼中有不熟悉的接口,要找到對應(yīng)接口文檔或源代碼分析,保證不要出現(xiàn)不必要的錯誤;
(3)如果函數(shù)中有對局部指針有內(nèi)存申請的操作,那么要檢查被保存的是全局變量嗎?會被作為函數(shù)返回值嗎?如果都不是的話,那要排查函數(shù)所有的“return”的地方,要保證內(nèi)存被正確釋放,不占用內(nèi)存。
編輯:jq
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4381瀏覽量
64853 -
代碼
+關(guān)注
關(guān)注
30文章
4900瀏覽量
70724 -
C代碼
+關(guān)注
關(guān)注
1文章
90瀏覽量
14777
原文標(biāo)題:一篇文章幫你解決C語言中的內(nèi)存泄漏問題
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Windows環(huán)境下32位匯編語言中文資料
在OpenVINO? C++代碼中啟用 AddressSanitizer 時的內(nèi)存泄漏怎么解決?
深入理解C語言:C語言循環(huán)控制

C語言中結(jié)構(gòu)體與聯(lián)合體的深度解析:內(nèi)存布局與應(yīng)用場景
快速搞懂C語言程序內(nèi)存分區(qū)!

內(nèi)存泄漏檢測工具Sanitizer介紹
分析C語言代碼結(jié)構(gòu)的設(shè)計問題
EE-62:在C語言中訪問短字內(nèi)存

EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù)

C語言中申請的堆內(nèi)存能不能自動釋放
RAM內(nèi)存不足的表現(xiàn)及解決方法
技術(shù)干貨驛站 ▏深入理解C語言:掌握C語言條件判斷,從if到switch的應(yīng)用

評論