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


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

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

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

3 67

3 ответа:

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

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

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

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

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

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

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

неудачи конструктора Херб Саттер

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

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

Кстати, именно поэтому деструктор никогда не будет вызван, если конструктор не преуспел -- нет ничего, чтобы уничтожать.

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

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

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

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

кроме того, как насчет наследования и членов?

применяется то же правило.

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

да

если только некоторые участники построенные, разве только те разрушаются?

да

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

да

виртуальное наследование что-нибудь меняет?

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

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

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