разматывание стека в исключении переполнение стека

Я начал изучать тему исключений в C ++.
Я столкнулся с термином «раскручивание стека», что означает, насколько я понимаю,
что всякий раз, когда генерируется исключение, и внутри «функции выброса» нет блока catch, стек функций «раскручивается», и этим будет вызываться d’or всего локального объекта (и то же самое будет происходить во внешних функциях). пока не будет найден подходящий улов).

Мой вопрос:

предположим, что исключение было сгенерировано внутри блока try с подходящим следующим уловом,
Будет ли d’Tor вызываться для всех объектов, определенных внутри блока try?
или ко всем объектам, определенным в блоке try, пока не произошло исключение? или к объекту вообще нет, и они будут «ждать» выхода из функции?

1

Решение

Семантика заключается в том, что любая локальная переменная, объявленная в блоке, должна быть уничтожена, когда элемент управления покидает блок (функция является именованным блоком с параметрами, которые являются локальными переменными). Поэтому, когда вы покидаете блок try, любая локально созданная переменная будет уничтожена и будет вызван соответствующий dtor. Все, что было создано, уничтожается, если что-то не было создано, оно просто не может быть уничтожено. Единственное, что не уничтожается, — это исключение самого объекта, если оно выброшено (конечно).

Из спецификации C ++:

15.2 Конструкторы и деструкторы 1. Поскольку управление переходит от точки, где исключение брошено к
обработчик, деструкторы вызываются для всех созданных автоматических объектов
поскольку блок try был введен. Автоматические объекты уничтожены
в обратном порядке завершения их строительства

15.2 Конструкторы и деструкторы 3. Процесс вызова деструкторов для построенных автоматических объектов
на пути от блока try к точке, где выдается исключение
называется «разматывание стека».

2

Другие решения


По вопросам рекламы [email protected]