C ++ Raii и разматывание стека - PullRequest
0 голосов
/ 04 июля 2010

(я изменил исходный вопрос, чтобы сделать его более значимым)

По отношению к оператору возврата уничтожается ли объект Raii до / после / между оператором возврата?

например

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

спасибо

Ответы [ 3 ]

2 голосов
/ 04 июля 2010

Чтобы ответить на ваш измененный вопрос, введите код:

return X;

X всегда будет оцениваться до того, как произойдет возврат.Тогда то, что происходит, эквивалентно всем вложенным областям действия функции, из которой выполняется выход, в порядке от самого внутреннего к крайнему, с деструкторами, вызываемыми соответствующим образом на каждом выходе.

1 голос
/ 04 июля 2010

Вы можете легко проверить это, написав свой собственный простой класс с деструктором, например,

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

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

Поместите разрыв в деструктор X и посмотрите, было ли значение увеличено в этот момент.Вы также можете попробовать скомпилировать с использованием / FA (Visual Studio) и посмотреть, какая сборка сгенерирована компилятором.

0 голосов
/ 04 июля 2010

Да - они эквивалентны. Блокировка уничтожается после приращения. В противном случае у вас возникла бы такая же проблема с последним случаем.

...