Уничтожены ли местные жители до или после вычисления возвращаемого значения функции?
Я думаю о создании класса, который представляетвладение примитива синхронизации, что-то вроде этого:
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()
будет вызван, пока блокировка удерживается.
Тем не менее, я не совсем понимаю, когда именно будет вычислено возвращаемое выражение.относительно точки, в которой вызывается деструктор блокировки, Гарантируется ли, что выражение будет оцененодо деструктор? Я бы так подумал, но я не уверен на 100%, и в противном случае это может привести к очень тонким, прерывистым, труднодоступным ошибкам!