在堆栈展开时使用 RAII 是否安全?
Is it safe to use RAII while stack unwinding?
class AutoSomething
{
public:
AutoSomething(Object& ob)
: object_(object)
{}
~AutoSomething()
{
object_.some_callback();
}
private:
Object& object_;
};
.........
void Object::some_function()
{
AutoSomething some(*this);
some_function_which_may_throw_exception();
}
问题是 - 当调用 AutoSomething 的析构函数时,Object 的状态是否正常?
堆栈展开是 RAII 最初发明的情况。因此,它无疑是合适的工具。
在您的特定情况下,代码没有理由不正确地运行。如果 some_callback
依赖于 Object
的内部不变量,则可能会出现唯一的问题,而当 some_function_which_may_throw_exception
实际抛出时不会维护该变量,但这将是特定代码的问题并且与C++ 本身。
class AutoSomething
{
public:
AutoSomething(Object& ob)
: object_(object)
{}
~AutoSomething()
{
object_.some_callback();
}
private:
Object& object_;
};
.........
void Object::some_function()
{
AutoSomething some(*this);
some_function_which_may_throw_exception();
}
问题是 - 当调用 AutoSomething 的析构函数时,Object 的状态是否正常?
堆栈展开是 RAII 最初发明的情况。因此,它无疑是合适的工具。
在您的特定情况下,代码没有理由不正确地运行。如果 some_callback
依赖于 Object
的内部不变量,则可能会出现唯一的问题,而当 some_function_which_may_throw_exception
实际抛出时不会维护该变量,但这将是特定代码的问题并且与C++ 本身。