Я начал изучать тему исключений в C ++.
Я столкнулся с термином «раскручивание стека», что означает, насколько я понимаю,
что всякий раз, когда генерируется исключение, и внутри «функции выброса» нет блока catch, стек функций «раскручивается», и этим будет вызываться d’or всего локального объекта (и то же самое будет происходить во внешних функциях). пока не будет найден подходящий улов).
Мой вопрос:
предположим, что исключение было сгенерировано внутри блока try с подходящим следующим уловом,
Будет ли d’Tor вызываться для всех объектов, определенных внутри блока try?
или ко всем объектам, определенным в блоке try, пока не произошло исключение? или к объекту вообще нет, и они будут «ждать» выхода из функции?
Семантика заключается в том, что любая локальная переменная, объявленная в блоке, должна быть уничтожена, когда элемент управления покидает блок (функция является именованным блоком с параметрами, которые являются локальными переменными). Поэтому, когда вы покидаете блок try, любая локально созданная переменная будет уничтожена и будет вызван соответствующий dtor. Все, что было создано, уничтожается, если что-то не было создано, оно просто не может быть уничтожено. Единственное, что не уничтожается, — это исключение самого объекта, если оно выброшено (конечно).
Из спецификации C ++:
15.2 Конструкторы и деструкторы 1. Поскольку управление переходит от точки, где исключение брошено к
обработчик, деструкторы вызываются для всех созданных автоматических объектов
поскольку блок try был введен. Автоматические объекты уничтожены
в обратном порядке завершения их строительства15.2 Конструкторы и деструкторы 3. Процесс вызова деструкторов для построенных автоматических объектов
на пути от блока try к точке, где выдается исключение
называется «разматывание стека».