C++实现Go Defer
defer和go一样都是Go语言提供的关键字。defer用于资源的释放,会在函数返回之前进行调用。一般采用如下模式:
f,err := os.Open(filename)
if err != nil {
panic(err)
}
defer f.Close()
如果有多个defer表达式,调用顺序类似于栈,越后面的defer表达式越先被调用。
那么作为一位C++开发苦于在资源管理时犹豫疏忽造成的资源未释放以及内存泄漏,是不是也可以实现类似Go Defer的机制呢,答案是肯定的,毕竟无所不能的C++没有什么是做不到的,其原理就是利用C++类的构造和析构函数来实现,废话不多说,直接上代码:
class CDefer
{
public:
CDefer(const std::function<void()>& constructor, const std::function<void()>& destructor);
~CDefer();
private:
std::function<void()> _constructor;
std::function<void()> _destructor;
};
CDefer::CDefer(const std::function<void()>& constructor, const std::function<void()>& destructor)
: _constructor(constructor)
, _destructor(destructor)
{
if (_constructor)
{
_constructor();
}
}
CDefer::~CDefer()
{
if (_destructor)
{
_destructor();
}
}