我正在考虑创建一个类,它表示同步原语的所有权,如下所示:
class CCriticalSectionLock
{
public:
CCriticalSectionLock( CCriticalSection &cs ) : cs( cs )
{ cs.Enter(); }
~CCriticalSectionLock()
{ cs.Leave(); }
private:
CCriticalSection &cs;
};这看起来是一种很好的方法,可以在函数期间获得所有权,并确保即使存在多个出口点或异常,也可以释放所有权。然而,它确实提出了一些微妙的问题,即编译器将在什么时候对各种事情进行评估。考虑以下用途:
int MyMethod( void )
{
not_locked(); // do something not under lock
CCriticalSectionLock myLock( someCriticalSection );
locked(); // do something under lock
return ...; // some expression
}AFAIK,C++生存期规则将保证在获取锁之前调用not_locked(),并在锁保持时调用locked()。
但是,我不太清楚的是,返回的表达式将在何时根据调用锁析构函数的点进行计算。它是否保证表达式将在析构函数之前进行计算?我会这样认为,但我不是百分百肯定,如果不是,它可能会导致非常微妙,间歇性,难以找到的错误!
发布于 2013-09-27 08:59:30
如果不是的话,那将是个很大的问题。
实际上,请考虑以下代码:
int function(){
MyClass myObject;
//stuff
return 5 + myObject.getNumericalValue();
}使用getNumericalValue(),一个简单的成员函数,它根据成员变量的计算返回一个int。如果表达式是在myObject销毁后进行评估的,那么您就会有未定义的行为,并且在isn语句中使用局部变量是不可能的(事实并非如此)。
在您的情况下,锁将在评估返回语句后销毁。
为了增加一些严格性,让我引用标准(第3.7.3/3节,强调我的标准):
如果具有自动存储持续时间的变量具有初始化或具有副作用的析构函数,则在其块结束之前不应销毁它,即使它似乎未使用,也不应作为优化而消除它。
对于函数来说,块的末尾是返回语句之后。
https://stackoverflow.com/questions/19046608
复制相似问题