gpt4 book ai didi

c++ - 正确替换 C++ 中缺失的 'finally'

转载 作者:可可西里 更新时间:2023-11-01 14:53:24 31 4
gpt4 key购买 nike

因为在 C++ 中没有 finally you have to use the RAII相反,如果您希望您的代码是异常安全的,请使用设计模式。一种方法是使用本地类的析构函数,如下所示:

void foo() {
struct Finally {
~Finally() { /* cleanup code */ }
} finalizer();
// ...code that might throw an exception...
}

与直接解决方案相比,这是一个很大的优势,因为您不必编写两次清理代码:

try {
// ...code that might throw an exception...
// cleanup code (no exception)
} catch (...) {
// cleanup code (exception)
throw;
}

本地类解决方案的一大缺点是您无法在清理代码中直接访问本地变量。因此,如果您无论如何都需要访问它们,它会使您的代码膨胀很多:

void foo() {
Task* task;
while (task = nextTask()) {
task->status = running;
struct Finally {
Task* task;
Finally(Task* task) : task(task) {}
~Finally() { task->status = idle; }
} finalizer(task);
// ...code that might throw an exception...
}
}

所以我的问题是: 是否有一种结合了这两种优点的解决方案?这样您 a) 不必编写重复代码,并且 b) 可以访问清理代码中的局部变量,例如上一个示例中的 task,但不会出现这样的代码膨胀。

最佳答案

除了定义 struct Finally,您还可以将清理代码提取到类 Task 的函数中,并使用 Loki 的 ScopeGuard .

ScopeGuard guard = MakeGuard(&Task::cleanup, task);

另见 DrDobb's article还有这个other article有关 ScopeGuard 的更多信息。

关于c++ - 正确替换 C++ 中缺失的 'finally',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/304979/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com