0

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

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

例如

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

谢谢你

4

3 回答 3

2

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

return X;

X 将始终在返回发生之前进行评估。然后发生的事情相当于退出函数的所有嵌套范围,从最里面到最外面的顺序,在每个退出时适当地调用析构函数。

于 2010-07-03T21:48:14.823 回答
1

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

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

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

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

于 2010-07-03T20:40:32.270 回答
0

是的 - 它们是等价的。锁在增量后被销毁。否则,您将在后一种情况下遇到同样的问题。

于 2010-07-03T20:37:00.657 回答