一、qScopeGuard介绍
QScopeGuard 是一个类,其唯一目的是运行函数f在它的析构函数中。这对于保证执行清理代码很有用,无论函数是正常退出、通过
return 语句提前退出还是通过异常退出。
qScopeGuard的作用是确保资源面对异常时总能被成功释放,就算没有正常返回,比如在函数中间任意位置return(参考下面的qScopeGuard应用示例)。
二、qScopeGuard应用示例
qScopeGuard作为一个函数,在作用域结束前会执行参数中的lambda函数。
void myComplexCodeWithMultipleReturnPoints(int v)
{
// The lambda will be executed right before your function returns
auto cleanup = qScopeGuard([] {
//code you want executed goes HERE;
});
if (v == -1)
return;
int v2 = code_that_might_throw_exceptions();
if (v2 == -1)
return;
(...)
}
三、实现分析
如果是纯C++,我们则需要自己实现ScopeGuard对象。
template <typename F>
class ScopeGuard
{
public:
explicit ScopeGuard( F && f) : m_func(std::move(f)), m_dismiss(false){}
explicit ScopeGuard(const F& f) : m_func(f), m_dismiss(false){}
ScopeGuard(ScopeGuard && rhs)
: m_func(std::move(rhs.m_func))
, m_dismiss(rhs.m_dismiss)
{
rhs.Dismiss();
}
~ScopeGuard()
{
if (!m_dismiss)
m_func();
}
void Dismiss()
{
m_dismiss = true;
}
private:
F m_func;
bool m_dismiss;
ScopeGuard();
ScopeGuard(const ScopeGuard&);
ScopeGuard& operator=(const ScopeGuard&);
}