Подтвердить что ты не робот

Какие деструкторы выполняются, когда конструктор генерирует исключение?

В С++, если конструктор генерирует исключение, какие деструкторы запускаются?

В частности, имеет ли значение какое-либо значение, если исключение находится во время списка инициализации или тела?

Также, как насчет наследования и членов? Предположительно, все завершенные конструкции разрушаются. Если создаются только некоторые члены, удаляйте только те, кто их разрушает? Если существует множественное наследование, все разрушенные конструкторы заканчиваются? Изменяет ли виртуальное наследование что-нибудь?

4b9b3361

Ответ 1

, если конструктор генерирует исключение, какие деструкторы запускаются?

Деструкторы всех объектов, полностью созданных в этой области.

Имеет ли значение какое-либо значение, если исключение находится во время списка инициализации или тела?

Все завершенные объекты будут разрушены.
Если конструктор никогда не был полностью вызван, объект никогда не строился и, следовательно, не мог быть разрушен.

как насчет наследования и членов? Предположительно, все завершенные конструкции разрушаются. Если создаются только некоторые члены, удаляйте только те, кто их разрушает? Если существует множественное наследование, все разрушенные конструкторы заканчиваются? Изменяет ли виртуальное наследование что-то?

Все завершенные конструкции разрушаются. Да, разрушаются только полностью созданные объекты.

Хорошее Чтение:

Отказ конструктора от Herb Sutter

Особенно, любите ту часть, где он объясняет:

В биологическом плане возникла концепция - конструктор начал - но, несмотря на все усилия, за ним последовал выкидыш - конструктор никогда не подходил к терминам (ination).

Кстати, вот почему деструктор никогда не будет вызван, если конструктор не увенчался успехом - нечего разрушать. "Он не может умереть, потому что он никогда не жил". Обратите внимание, что это делает фразу "объект, конструктор которого выбрасывает исключение" - действительно оксюморон. Такая вещь даже меньше, чем экс-объект... он никогда не жил, никогда не был, никогда не дышал первым.

Ответ 2

В С++, если конструктор генерирует исключение, какие деструкторы запускаются?

Все объекты, у которых есть конструкторы, заканчиваются.

В частности, имеет ли значение какое-либо значение, если исключение находится во время списка инициализации или тела?

Нет. Все члены, которые полностью построены до исключения, будут запускать свои деструкторы. Член, который бросил во время строительства и всех других нестроенных членов, будет не работать с их деструкторами. Порядок построения членов определен правильно и, следовательно, вы точно знаете, что произойдет, если вы знаете точку выброса исключения.

Также, как насчет наследования и членов?

Используется одно и то же правило.

Предположительно, все завершенные конструкции разрушаются.

Да

Если создаются только некоторые элементы, удаляйте только те, кто их разрушает?

Да

Если существует множественное наследование, выполняются ли все завершенные конструкторы?

Да

Изменено ли виртуальное наследование?

Нет.
Но обратите внимание: виртуальное наследование влияет на порядок, вызываемый конструкторами. Если вы не знакомы с тем, как определяется порядок, это может быть неинтуитивным, пока вы не найдете точные правила.

Ответ 3

Любой объект, созданный в локальной области, оставшейся из-за конструктора, будет быть разрушенным. Обработка времени выполнения выполняет резервное копирование стека, вызывая деструкторов, пока не найдет обработчик.

Если исключение выбрано из конструктора, деструкторы всех будем называть полностью построенные подобъекты. Кроме того, если конструктор был частью выражения new, соответствующее размещение оператор delete будет вызываться, если он существует.