我想到做这代表了同步的所有权原始的,像这样一类:本地人在评估函数返回值之前还是之后被销毁?
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
}
据我所知,C++一生规则将保证not_locked()
将之前被称为锁被采取,并且当锁被认为locked()
将被调用。
然而,什么我不是很清楚是什么时候返回的表达式将被评估相对于在上述锁定调用析构函数点。是否保证表达式在之前将被评估为?我会这样想,但我不是100%肯定的,如果不是这样,它可能会导致非常微妙的,间歇性的,难以发现的错误!
重复:[什么是第一次 - 堆栈展开或复制返回值](http://stackoverflow.com/q/8923018/220636) – nabulke
@nabulke所以这就是为什么我没有找到任何东西...我是寻找破坏/评估,但隐藏在展开/复制下。 – Kevin