Выйти из блока: вызывать деструкторов? - PullRequest
41 голосов
/ 05 июля 2010

Рассмотрим следующий код:

void foo()
{
    {
        CSomeClass bar;

        // Some code here...

        goto label;

        // and here...
    }

label:
    // and here...
}

Будет ли называться деструктор бара?

Ответы [ 4 ]

58 голосов
/ 05 июля 2010

Стандарт C ++ гласит:

при выходе из области видимости (однако выполнено), деструкторы (12.4) называется для всех построенных объектов с автоматической продолжительностью хранения (3.7.2) (именованные объекты или временные объекты) которые объявлены в этой области, в обратный порядок их декларация.

Так что ответ "да".

24 голосов
/ 05 июля 2010

Да, они будут называться.

Обновление: (это нормально, gotos ничуть не хуже, чем генерирование фиктивных исключений или использование bools / ifs для выхода из ситуации.Простой переход внутрь функции не превращает ее в код спагетти.)

8 голосов
/ 05 июля 2010

1) Да. 2) Не делай этого.

Разработка: концептуально это ничем не отличается от выхода из цикла через break. goto, однако, сильно, настоятельно не рекомендуется. Почти никогда не нужно использовать goto, и любое использование должно быть тщательно изучено, чтобы выяснить, что происходит.

5 голосов
/ 10 апреля 2013

Да, как все говорят. C ++ определяет / предписывает это.

Но для полноты изложения добавим: если ваше goto использует вычисленное расширение goto, найденное в некоторых компиляторах - gcc, clang, возможно, в других, но не , включая MSVC, последний раз знал - будет ли вызван деструктор объекта, довольно туманно. Когда goto идет в одно место, очень ясно, какие деструкторы должны быть вызваны перед передачей потока управления. Но с вычисленным goto могут потребоваться динамические вызовы различных деструкторов, чтобы получить «ожидаемую» семантику. Я не уверен, что делают компиляторы, которые реализуют это расширение, в этих случаях. Я вспомнил, что столкнулся с этим, что clang предупреждает, когда вычисленная goto может оставить область действия с объектом с нетривальным деструктором, утверждая, что деструктор не будет вызван. В некоторых случаях это может быть хорошо, в других нет. Я не знаю, что делают другие компиляторы. Просто знайте о проблеме, если вы хотите использовать вычисленные goto s совместно с объектами с нетривиальными деструкторами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...