C ++ Raii和堆栈展开

时间:2010-07-03 20:34:39

标签: c++ scope raii

(我修改了原来的问题更有意义)

关于return语句,Raii对象是在return语句之前/之后/之间销毁的吗?

例如

size_t advance() {
    boost::lock_guard<boost::mutex> lock(mutex_);
    return value_++;  // is lock destroyed after increment?
}

谢谢

3 个答案:

答案 0 :(得分:2)

要回答您修改过的问题,请给出以下代码:

return X;

将始终在返回之前评估X.然后发生的事情等同于退出函数的所有嵌套作用域,从最内层到最外层,在每个出口处适当地调用析构函数。

答案 1 :(得分:1)

您可以使用析构函数编写自己的简单类来轻松测试,例如

class X
   {
   public:
      ~X() { std::cout << "X::destructor" << std::endl;
   }

size_t advance()
   {
   X x;
   return value++;
   }

在X的析构函数中放一个中断,看看当时值是否已增加。您也可以尝试使用/ FA(Visual Studio)进行编译,并查看编译器生成的程序集。

答案 2 :(得分:0)

是的 - 它们是等同的。增量后锁定被销毁。否则你会遇到与后一种情况相同的问题。