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 扩展功能,不过也不排除后面被加到标准里面的可能性。
了解一下就行,不建议使用,太过于冷门。
全部0条评论
快来发表一下你的评论吧 !