只有在堆內(nèi)存里面才會(huì)發(fā)生內(nèi)存泄漏的問(wèn)題,在棧內(nèi)存中不會(huì)發(fā)生內(nèi)存泄漏。因?yàn)闂?nèi)存在自動(dòng)分配空間之后,還會(huì)自動(dòng)釋放空間。
什么是堆內(nèi)存?存儲(chǔ)方式是什么樣的呢?
首先我們先來(lái)介紹一下堆內(nèi)存在C代碼中的存儲(chǔ)方式。C代碼中動(dòng)態(tài)申請(qǐng)堆內(nèi)存的申請(qǐng)函數(shù)是malloc,常見(jiàn)的內(nèi)存代碼如下圖所示:
因?yàn)閙alloc函數(shù)返回值是一個(gè)內(nèi)存地址,所以保存堆內(nèi)存的變量一定得是一個(gè)指針,當(dāng)然這個(gè)變量可以是一個(gè)單指針,也可以是一個(gè)多重指針。
如何獲取堆內(nèi)存?
對(duì)于堆內(nèi)存的獲取方法,我們可以有兩種方法,第一種是用返回值傳遞內(nèi)存指針,第二種方法是通過(guò)參數(shù)傳遞給內(nèi)存指針。上面我們用到的malloc申請(qǐng)內(nèi)存,就是屬于方法一的一種具體表現(xiàn)形式,是直接把返回值傳遞給內(nèi)存指針。
方法一:把函數(shù)返回值直接賦值給指針,一般表現(xiàn)形式如下:
方法二:將指針地址作為函數(shù)返回參數(shù),通過(guò)返回參數(shù)保存堆內(nèi)存地址,一般表現(xiàn)形式如下:
總結(jié):這兩類方法的本質(zhì)是一樣的,都是函數(shù)內(nèi)存間接申請(qǐng)了內(nèi)存,但是只有傳遞內(nèi)存的方法不一樣,方法一是通過(guò)返回值傳遞內(nèi)存指針,方法二是通過(guò)參數(shù)傳遞內(nèi)存指針。
內(nèi)存泄漏的三個(gè)原因
當(dāng)我們的代碼出現(xiàn)內(nèi)存泄漏的時(shí)候,一般都會(huì)包含以下幾個(gè)原因:
- 函數(shù)內(nèi)有局部指針變量定義
- 對(duì)該局部指針有獲取內(nèi)存的操作
- 在函數(shù)返回前沒(méi)有釋放該內(nèi)存,也未保存到其他全局變量或返回上一級(jí)函數(shù)
如何檢查內(nèi)存泄漏
為了避免檢查內(nèi)存泄漏,我們還是要養(yǎng)成良好的編碼習(xí)慣。當(dāng)我們要進(jìn)行檢查內(nèi)存泄漏問(wèn)題的時(shí)候,一般要做到以下三點(diǎn):
- 當(dāng)我們?cè)诤瘮?shù)中看到有局部指針的時(shí)候,一定要仔細(xì)檢查是否有存泄漏的問(wèn)題發(fā)生,養(yǎng)成仔細(xì)檢查的習(xí)慣
- 如果有局部變量,并且有對(duì)局部變量賦值的操作,要檢查函數(shù)的返回的指針到底是指向什么?是全局變量、靜態(tài)數(shù)據(jù)還是堆內(nèi)存?如果代碼中有不熟悉的接口,要找到對(duì)應(yīng)接口文檔或源代碼分析,保證不要出現(xiàn)不必要的錯(cuò)誤
- 如果函數(shù)中有對(duì)局部指針有內(nèi)存申請(qǐng)的操作,那么要檢查被保存的是全局變量嗎?會(huì)被作為函數(shù)返回值嗎?如果都不是的話,那要排查函數(shù)所有的“return”的地方,要保證內(nèi)存被正確釋放,不占用內(nèi)存
-
存儲(chǔ)
+關(guān)注
關(guān)注
13文章
4510瀏覽量
87178 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3115瀏覽量
75073 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4374瀏覽量
64423
發(fā)布評(píng)論請(qǐng)先 登錄
堆棧內(nèi)存和堆內(nèi)存之間的區(qū)別

內(nèi)存管理實(shí)例中運(yùn)行Test函數(shù)會(huì)有什么樣的結(jié)果
【原創(chuàng)】堆內(nèi)存的那些事
堆和棧的區(qū)別是什么
單片機(jī)下的堆和棧是什么樣的分布呢?
ESP8266上的內(nèi)存類型有多少?
什么樣的冰箱沒(méi)有霜
未來(lái)存儲(chǔ)技術(shù)的發(fā)展是什么樣的
5G給內(nèi)存和存儲(chǔ)帶來(lái)了什么樣的發(fā)展美光科技的解答
簡(jiǎn)述C語(yǔ)言中的內(nèi)存泄漏的原理及解決方法

什么是堆內(nèi)存?堆內(nèi)存是如何分配的?
程序內(nèi)存分區(qū)中的堆與棧

malloc 申請(qǐng)內(nèi)存的兩種方式

評(píng)論