堆栈展开时使用RAII是否安全?

时间:2016-07-01 05:36:45

标签: c++ exception destructor raii 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的状态是否正常?

1 个答案:

答案 0 :(得分:6)

堆叠展开是 的位置,首先发明了RAII。所以它肯定是适当的工具。

在您的特定情况下,没有理由为什么代码行为不正确。如果some_callback依赖于Object的内部不变量,而some_function_which_may_throw_exception实际抛出时不会保留,则会出现唯一的问题,但这会导致特定代码出现问题而与此无关C ++本身。