(我修改了原来的问题更有意义)
关于 return 语句,Raii 对象是否在 return 语句之前/之后/之间被销毁?
例如
size_t advance() {
boost::lock_guard<boost::mutex> lock(mutex_);
return value_++; // is lock destroyed after increment?
}
谢谢你
要回答您修改后的问题,请给出代码:
return X;
X 将始终在返回发生之前进行评估。然后发生的事情相当于退出函数的所有嵌套范围,从最里面到最外面的顺序,在每个退出时适当地调用析构函数。
您可以通过使用析构函数编写自己的简单类来轻松测试这一点,例如
class X
{
public:
~X() { std::cout << "X::destructor" << std::endl;
}
size_t advance()
{
X x;
return value++;
}
在 X 的析构函数中放置一个中断,并查看此时 value 是否已经增加。您也可以尝试使用 /FA (Visual Studio) 进行编译,并查看编译器生成的程序集。
是的 - 它们是等价的。锁在增量后被销毁。否则,您将在后一种情况下遇到同样的问题。