Рассмотрим следующий код:
void foo()
{
{
CSomeClass bar;
// Some code here...
goto label;
// and here...
}
label:
// and here...
}
Будет вызван деструктор бара?
Рассмотрим следующий код:
void foo()
{
{
CSomeClass bar;
// Some code here...
goto label;
// and here...
}
label:
// and here...
}
Будет вызван деструктор бара?
В стандарте С++ говорится:
При выходе из области действия (однако), деструкторы (12.4) для всех построенных объектов с автоматической продолжительностью хранения (3.7.2) (названные объекты или временные) которые объявлены в этой области, в обратный порядок их декларация.
Итак, ответ "да".
Да, они будут вызваны.
Обновление: (это нормально делать, gotos не хуже, чем бросать фиктивные исключения или использовать bools/ifs, чтобы выбраться из вещей. Простой goto внутри функции не делает его спагетти-кодом.)
1) Да. 2) Не делайте этого.
Разработка: концептуально, это ничем не отличается от выхода из цикла через break
. goto
, однако, сильно, сильно обескуражен. Практически никогда не нужно использовать goto
, и любое использование должно быть тщательно изучено, чтобы узнать, что происходит.
Да, как все говорят. С++ указывает/указывает на это.
Но просто добавим к этому, для полноты: если ваш goto
использует расширение computed- goto
, обнаруженное в некоторых компиляторах - gcc, clang, возможно, другие, но не включая MSVC, которые я знал, - независимо от того, объект деструктор будет называться довольно туманным. Когда goto
переходит в одно место, он очень четко указывает, какие деструкторы должны быть вызваны перед передачей потока управления. Но с вычисленным goto
разным деструкторам, возможно, потребуется динамически вызывать, чтобы дать "ожидаемую" семантику. Я не уверен, какие компиляторы, которые реализуют это расширение, делают в этих случаях. Моя память от столкновения с этим заключается в том, что clang предупреждает, когда computed- goto
может покинуть область с объектом с нетривальным деструктором, заявив, что деструктор не будет вызван. В некоторых случаях это может быть хорошо, в других нет. Я не знаю, что делают другие компиляторы. Просто имейте в виду проблему, если вы хотите использовать вычисляемый goto
совместно с объектами с нетривиальными деструкторами.