C++ 实现 defer 功能
背景
是否遇到过忘记 free 或者 delete 等造成的内存泄漏?是否想在代码开始的地方就写好流程结束需要做的事情? 比如在进行 socket 相关编码的时候,需要在代码末尾调用 free? 本文皆在实现一种方式,使得在函数生命周期结束的时候自动调用预先注册的代码,示例如下:
void Test(){
defer(std::cout<<"End"<<std::endl;);
std::cout<<"Start"<<std::endl;
}
int main(){
Test();
/*
output:
Start
End
*/
return 0;
}
即我们放置在 defer 的内容,总是会在函数 Test 生命周期结束的时候才被调用
实现思路
我们可以实现一个 defer(expr)宏,生成一个栈上分配空间的对象,将内容(expr)包装在析构函数里,这样当当前函数生命周期结束的时候,会自动调用该对象的析构函数,即执行 expr了。
难点
一个函数里想通过defer生成多个对象,如何避免名称重复?
可以通过 __COUNTER__ 宏来生成不一样的名字<