C語言中申請的堆內(nèi)存能不能自動釋放?每次都要手動 free 太麻煩,也容易忘記。
學(xué)過 C++ 的同學(xué),應(yīng)該首先能想到智能指針。
但是這是C語言,沒有類和對象、構(gòu)造析構(gòu)這些技術(shù),想要自動釋放很難。
下面給大家介紹一種黑科技。
之前我們講過 GNU 的 attribute 屬性,里面可以是 packed unused 等等,還有一個,叫 cleanup。
cleanup的作用就是當(dāng)其聲明的變量離開了生命周期,就會調(diào)用指定的函數(shù)。
這剛好滿足了我們的要求。
比如這樣的代碼,給 str 申請了內(nèi)存,但是整個代碼中也沒有釋放,妥妥的內(nèi)存泄漏。
定義 str 的時候,可以在后面加上 attribute cleanup,指定函數(shù) func,意思就是,當(dāng)變量 str 生命周期結(jié)束的時候,會調(diào)用 func 函數(shù)。換句話說,只要 main 函數(shù)結(jié)束了,就會調(diào)用 func 函數(shù)。
func 函數(shù)有個參數(shù),是變量 str 的地址,可以寫成 char ** 類型,在函數(shù)的內(nèi)部可以釋放剛才申請的堆內(nèi)存。
這樣在 main 函數(shù)結(jié)束的時候,就會自動調(diào)用 func 函數(shù)釋放堆內(nèi)存,有點(diǎn)智能指針的意思。
有了 func 函數(shù),在任意地方定義指針,只要加上 attribute 屬性,函數(shù)運(yùn)行結(jié)束,就能自動釋放堆內(nèi)存。
attribute 屬性并不是 C 標(biāo)準(zhǔn)內(nèi)容,屬于 GNU 擴(kuò)展功能,不過也不排除后面被加到標(biāo)準(zhǔn)里面的可能性。
了解一下就行,不建議使用,太過于冷門。
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3103瀏覽量
74918 -
C語言
+關(guān)注
關(guān)注
180文章
7628瀏覽量
139976 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4365瀏覽量
63965
原文標(biāo)題:堆內(nèi)存也能自動釋放
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
分析C語言代碼結(jié)構(gòu)的設(shè)計問題
指針被釋放后就變成了空指針嗎
EE-62:在C語言中訪問短字內(nèi)存

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

評論