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)存,有點智能指針的意思。
有了 func 函數(shù),在任意地方定義指針,只要加上 attribute 屬性,函數(shù)運行結(jié)束,就能自動釋放堆內(nèi)存。
attribute 屬性并不是 C 標(biāo)準(zhǔn)內(nèi)容,屬于 GNU 擴展功能,不過也不排除后面被加到標(biāo)準(zhǔn)里面的可能性。
了解一下就行,不建議使用,太過于冷門。
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3045瀏覽量
74204 -
C語言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137378 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4344瀏覽量
62855
原文標(biāo)題:堆內(nèi)存也能自動釋放
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論