C 11 中的作用域守卫
C 11 lambda 表达式的主要优点之一在于它们能够表达 RAII 的概念 (资源获取就是初始化),简洁优雅。 RAII 的传统实现依赖析构函数来释放资源,但使用 lambda 表达式,可以创建一个对象,该对象将在退出其作用域时执行清理函数,无论退出是如何发生的。这称为作用域保护。
简单作用域保护实现
以下是 C 11 中简单作用域保护实现的示例:
templateScopeGuard 类采用 lambda 表达式作为其构造函数参数,该参数表示当作用域防护超出作用域时要执行的清理操作。 commited标志表示清理动作是否已经执行。
用法
ScopeGuard类可用于确保资源被正确释放,即使发生异常。例如,以下函数获取资源并确保使用范围保护释放该资源:
void SomeFuncThatShouldBehaveAtomicallyInCaseOfExceptions()
{
std::vector<int> myVec;
std::vector<int> someOtherVec;
myVec.push_back(5);
//first constructor, adquire happens elsewhere
const auto& a = RAII::makeScopeGuard( [&]() { myVec.pop_back(); } );
//sintactically neater, since everything happens in a single line
const auto& b = RAII::makeScopeGuard( [&]() { someOtherVec.push_back(42); }
, [&]() { someOtherVec.pop_back(); } );
b.commit();
a.commit();
}
在此示例中,ScopeGuard 用于确保即使发生异常也能从向量中删除元素。
结论
范围防护是确保在 C 11 中正确释放资源的强大工具。此处介绍的简单实现是实现此模式的直接方法。然而,还有更复杂的实现提供附加功能,例如在范围保护之间转移资源所有权的能力。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3