C語(yǔ)言中申請(qǐng)的堆內(nèi)存能不能自動(dòng)釋放?每次都要手動(dòng) free 太麻煩,也容易忘記。
學(xué)過(guò) C++ 的同學(xué),應(yīng)該首先能想到智能指針。
但是這是C語(yǔ)言,沒(méi)有類(lèi)和對(duì)象、構(gòu)造析構(gòu)這些技術(shù),想要自動(dòng)釋放很難。
下面給大家介紹一種黑科技。
之前我們講過(guò) GNU 的 attribute 屬性,里面可以是 packed unused 等等,還有一個(gè),叫 cleanup。
cleanup的作用就是當(dāng)其聲明的變量離開(kāi)了生命周期,就會(huì)調(diào)用指定的函數(shù)。
這剛好滿足了我們的要求。
比如這樣的代碼,給 str 申請(qǐng)了內(nèi)存,但是整個(gè)代碼中也沒(méi)有釋放,妥妥的內(nèi)存泄漏。
定義 str 的時(shí)候,可以在后面加上 attribute cleanup,指定函數(shù) func,意思就是,當(dāng)變量 str 生命周期結(jié)束的時(shí)候,會(huì)調(diào)用 func 函數(shù)。換句話說(shuō),只要 main 函數(shù)結(jié)束了,就會(huì)調(diào)用 func 函數(shù)。
func 函數(shù)有個(gè)參數(shù),是變量 str 的地址,可以寫(xiě)成 char ** 類(lèi)型,在函數(shù)的內(nèi)部可以釋放剛才申請(qǐng)的堆內(nèi)存。
這樣在 main 函數(shù)結(jié)束的時(shí)候,就會(huì)自動(dòng)調(diào)用 func 函數(shù)釋放堆內(nèi)存,有點(diǎn)智能指針的意思。
有了 func 函數(shù),在任意地方定義指針,只要加上 attribute 屬性,函數(shù)運(yùn)行結(jié)束,就能自動(dòng)釋放堆內(nèi)存。
attribute 屬性并不是 C 標(biāo)準(zhǔn)內(nèi)容,屬于 GNU 擴(kuò)展功能,不過(guò)也不排除后面被加到標(biāo)準(zhǔn)里面的可能性。
了解一下就行,不建議使用,太過(guò)于冷門(mén)。
-
內(nèi)存
+關(guān)注
關(guān)注
9文章
3209瀏覽量
76358 -
C語(yǔ)言
+關(guān)注
關(guān)注
183文章
7644瀏覽量
145576 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4417瀏覽量
67502
原文標(biāo)題:堆內(nèi)存也能自動(dòng)釋放
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
keil中c語(yǔ)言的動(dòng)態(tài)分配內(nèi)存
C語(yǔ)言嵌入式系統(tǒng)編程注意事項(xiàng)-內(nèi)存操作
單片機(jī)c語(yǔ)言中定義字節(jié)怎么定義?
請(qǐng)問(wèn)C語(yǔ)言中整形溢出會(huì)產(chǎn)生哪些異常行為?
嵌入式C語(yǔ)言中各變量存儲(chǔ)位置
請(qǐng)問(wèn)C語(yǔ)言中整形溢出對(duì)哪些應(yīng)用場(chǎng)景影響較大?
C語(yǔ)言內(nèi)存池使用
堆和棧的區(qū)別
工廠設(shè)備能不能工業(yè)數(shù)采?3招教你快速判斷,省時(shí)又省錢(qián)!
C語(yǔ)言中申請(qǐng)的堆內(nèi)存能不能自動(dòng)釋放
評(píng)論