18 Exception handling [except]

18.2 Constructors and destructors [except.ctor]

Когда управление переходит от точки, в которой возникло исключение, к обработчику, деструкторы вызываются процессом, указанным в этом разделе stack unwinding.

Деструктор вызывается для каждого автоматического объекта типа класса, созданного, но еще не уничтоженного, так как был введен блок try. Если во время уничтожения временных или локальных переменных для a возникает исключение, return statementтакже вызывается деструктор для возвращенного объекта (если есть). Объекты уничтожаются в порядке, обратном завершению их строительства. [Example:

struct A { };

struct Y { ~Y() noexcept(false) { throw 0; } };

A f() {
  try {
    A a;
    Y y;
    A b;
    return {};      // #1
  } catch (...) {
  }
  return {};        // #2
}

В №1 создается возвращаемый объект типа A . Затем локальная переменная b уничтожается ([stmt.jump]). Затем локальная переменная y уничтожается, вызывая раскручивание стека, что приводит к уничтожению возвращенного объекта с последующим уничтожением локальной переменной a. Наконец, возвращенный объект снова создается в # 2. ]end example

Если инициализация или уничтожение объекта, отличного от делегирующего конструктора, завершается исключением, деструктор вызывается для каждого из прямых подобъектов объекта и, для полного объекта, подобъектов виртуального базового класса, инициализация которых завершена ([dcl.init]) и чья деструктор еще не начал выполнение, за исключением того, что в случае уничтожения варианты членов объединенного класса не уничтожаются. Подобъекты уничтожаются в порядке, обратном завершению их строительства. Такое уничтожение выполняется до входа в обработчик function-try-blockконструктора или деструктора, если таковой имеется.

Если compound-statement компонент function-body делегирующего конструктора для объекта завершается через исключение, вызывается деструктор объекта. Такое уничтожение выполняется до входа в обработчик function-try-blockконструктора делегирования для этого объекта, если таковой имеется.

[ Note: Если объект был выделен a new-expression, то соответствие deallocation function, если таковое имеется, вызывается для освобождения памяти, занимаемой объектом. ]end note