Какие деструкторы вызываются при ошибке конструктора?

Вывод будет A, B, ~A, caught. Поле a успело построиться и уничтожается при раскрутке стека. Объекты b и C не завершили создание, их деструкторы не вызываются.

Короткий ответ

Что ответить на собеседовании

Вывод будет A, B, ~A, caught. Поле a успело построиться и уничтожается при раскрутке стека. Объекты b и C не завершили создание, их деструкторы не вызываются.

Подробный разбор

Ответ с пояснениями

Условие

В C++ класс C содержит поля A a; B b; в таком порядке. Конструктор A печатает A. Конструктор B печатает B и бросает std::runtime_error. Тело конструктора C печатает C. Деструкторы печатают ~A, ~B, ~C. Создание локального C находится внутри try, catch печатает caught. Каков вывод?

Ответ

Вывод будет A, B, ~A, caught. Поле a успело построиться и уничтожается при раскрутке стека. Объекты b и C не завершили создание, их деструкторы не вызываются.

Тело конструктора C вообще не начнёт выполняться: инициализация поля b завершилась исключением. Уже завершённые подобъекты автоматически уничтожаются в обратном порядке. Ресурс, захваченный внутри B до исключения, должен находиться под управлением RAII-поля или локального объекта: рассчитывать на вызов ~B в этой ситуации нельзя. В условии рассматривается обычный, не делегирующий конструктор.

Источник: eel.is.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее