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

Что произойдет, если в конструкторе возникает исключение

Возможный дубликат:
Что происходит с деструктором базового класса, если деструктор производного класса генерирует исключение

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

4b9b3361

Ответ 1

Деструкторы базового класса (es) затем вызывают в обратном порядке.

До этого деструкторы любого уже инициализированного элемента также будут вызваны.

Однако деструктор построенного в настоящее время производного класса не будет вызван, так как эта часть объекта еще не была бы построена.

Ответ 2

Да. Например, рассмотрим:

#include <iostream>

class B
{
public:
    B() { std::cout << "B()\n"; }
    ~B() { std::cout << "~B()\n"; }
};

class D : public B
{
public:
    D() { std::cout << "D()\n"; throw 23; }
    ~D() { std::cout << "~D()\n"; }
};

int main()
try
{
    D d;
    return 0;
}
catch(...) {}

Вывод:

B()
D()
~B()

Ответ 3

http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.10

Каждый элемент данных внутри вашего объекта должен очистить свой беспорядок.

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

Базовые деструкторы гарантированно будут вызываться, но не деструктор самого объекта.

Ответ 4

Да. По завершении построения базового или вспомогательного объекта этот под-объект будет надлежащим образом уничтожен, если будет создано исключение.

Ответ 5

Собственно, бросание исключения в конструктор является одним из способов ОБОРОТНОГО ОБЕСПЕЧЕНИЯ ОБНАРУЖЕНИЯ СБОРА ОБЪЕКТОВ, если он правильно обрабатывается вызывающим, поскольку нет никакого возвращаемого значения конструктора.