Подтвердить что ты не робот

Выйти из блока: вызвать деструкторы?

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

void foo()
{
    {
        CSomeClass bar;

        // Some code here...

        goto label;

        // and here...
    }

label:
    // and here...
}

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

4b9b3361

Ответ 1

В стандарте С++ говорится:

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

Итак, ответ "да".

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Да, как все говорят. С++ указывает/указывает на это.

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