在 glib 里发现的黑魔法,可以实现这样的效果:当一个变量的生命周期结束时,调用特定的函数,传入指向该变量的指针。类似于 C++ 中的析构函数。
其具体实现依赖于 GNU 对 C 的一个拓展,名为 cleanup 的 attribute,该拓展在 gcc 和 clang 中都可用,无需特殊编译选项,MSVC 中不可用
。
如图所示代码,当 ptr 的生命周期结束时(即离开 main 函数的作用域时),cleanup_func 函数会被调用,接收一个指向 ptr 的指针,即 &ptr。于是在 cleanup_func 中使用 free 可以实现对 ptr 指向的内存的自动释放。