C语言中申请的堆内存能不能自动释放

描述

C语言中申请的堆内存能不能自动释放?每次都要手动 free 太麻烦,也容易忘记。

学过 C++ 的同学,应该首先能想到智能指针。

但是这是C语言,没有类和对象、构造析构这些技术,想要自动释放很难。

下面给大家介绍一种黑科技。

之前我们讲过 GNU 的 attribute 属性,里面可以是 packed unused 等等,还有一个,叫 cleanup。

cleanup的作用就是当其声明的变量离开了生命周期,就会调用指定的函数。

这刚好满足了我们的要求。

比如这样的代码,给 str 申请了内存,但是整个代码中也没有释放,妥妥的内存泄漏。

定义 str 的时候,可以在后面加上 attribute cleanup,指定函数 func,意思就是,当变量 str 生命周期结束的时候,会调用 func 函数。换句话说,只要 main 函数结束了,就会调用 func 函数。

func 函数有个参数,是变量 str 的地址,可以写成 char ** 类型,在函数的内部可以释放刚才申请的堆内存。

这样在 main 函数结束的时候,就会自动调用 func 函数释放堆内存,有点智能指针的意思。

有了 func 函数,在任意地方定义指针,只要加上 attribute 属性,函数运行结束,就能自动释放堆内存。

attribute 属性并不是 C 标准内容,属于 GNU 扩展功能,不过也不排除后面被加到标准里面的可能性。

了解一下就行,不建议使用,太过于冷门。
 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分