Я прочитал несколько статей здесь и в других местах, где можно вызывать исключения из конструктора. Однако я заметил, что он не вызывает деструктор базового класса или его членов данных, если исключение выдается из конструктора. Рассмотрим следующий пример:
#include <iostream>
using namespace std;
struct C
{
C() { cout << __FUNCTION__ << endl; }
~C() { cout << __FUNCTION__ << endl; }
};
struct E: public C
{
C c;
E() { cout << __FUNCTION__ << endl; throw 4; }
~E() { cout << __FUNCTION__ << endl; }
};
int main()
{
E e;
}
$ g++ test.cpp; ./a.exe
C
C
E
terminate called after throwing an instance of 'int'
Aborted (core dumped)
В этом случае конструктор E выдает исключение, но деструктор C как элемент данных или базовый класс не вызывается. Теперь, если деструктор C выполняет некоторые операции очистки, такие как закрытие файлов / сокетов и удаление выделений из кучи, это может вызвать проблемы.
Итак, мой вопрос: почему и когда можно генерировать исключения из конструкторов?