Страница 2 из 2
Re: А можно ли бросать исключения из конструктора?
Добавлено: 13 дек 2015, 17:49
Сионист
Так мало ли где этот if валяется. Может за cathc?
Re: А можно ли бросать исключения из конструктора?
Добавлено: 13 дек 2015, 17:53
Absurd
Каким образом ты собираешься передать туда указатель на тот участок памяти где пытались сконструировать объект?
Re: А можно ли бросать исключения из конструктора?
Добавлено: 13 дек 2015, 17:59
Сионист
А зачем мне указатель? Он ваще то именован.
Re: А можно ли бросать исключения из конструктора?
Добавлено: 13 дек 2015, 18:37
Absurd
напиши полный код с catch.
Re: А можно ли бросать исключения из конструктора?
Добавлено: 14 дек 2015, 06:41
Сионист
Код: Выделить всё
std::ifsream f;
int x;
try
{
A a(123);
}
catch (const std::u32string &ErrorMessage)
{
Log<<ErrorMessage;
}
if ((bool)a)
{
f.open(a[0]);
f>>x;
f.close();
}
Re: А можно ли бросать исключения из конструктора?
Добавлено: 14 дек 2015, 10:17
Romeo
Сионист, а ничего, что а уже не существует в том месте, где ты делаешь if? Ты имеешь хоть базовые понятия об областях видимости? Ну, или на худой конец, не пробовал хотя бы скомпилировать свой код?
По поводу ответа на твой вопрос. Да, из конструкторов можно кидать исключения. Стандартом полностью прописано поведение кода в этом случае.
- Деструкторы будут автоматически вызваны для всех уже инициализированных базовых классов (если исключение полетело из базового конструктора)
- Деструкторы будут автоматически вызваны для всех уже инициализированных базовых классов и уже инициализированных полей текущего класса (если исключение полетело в списке инициализации)
- За все иные утечки ответственен программист (то есть если мы выделяем память под некие поля в теле конструктора, а не в списке инициализации, то можем попасть в ситуацию partial initialization, для избежания которой обязаны ловить исключение внутри тела конструктора, в catch делать "чистку", а затем пробрасывать исключение дальше).
- Объект, для которого было проброшено исключение построенным не считается.
И если уж на то пошло, то этот вопрос отлично гуглится...
Re: А можно ли бросать исключения из конструктора?
Добавлено: 14 дек 2015, 12:11
Сионист
А для объектов, агрегированных не построенным объектом деструкторы будут вызваны?
Re: А можно ли бросать исключения из конструктора?
Добавлено: 14 дек 2015, 12:14
Romeo
Я же достаточно ясно написал об этом, вроде:
Romeo писал(а):
- Деструкторы будут автоматически вызваны для всех ... уже инициализированных полей текущего класса (если исключение полетело в списке инициализации)
- За все иные утечки ответственен программист...
Подробнее объяснить? Я не знаю, куда уже подробнее.
Re: А можно ли бросать исключения из конструктора?
Добавлено: 14 дек 2015, 12:45
Сионист
При чём здесь список инициализации?
Код: Выделить всё
A
{
std::ustring s;
public:
A (const int &x)
{
s=U"...";
...
throw ...;
}
};
A a(2);
Будет ли вызван деструктор для a.s, если при создании a было брошено исключение?
Re: А можно ли бросать исключения из конструктора?
Добавлено: 14 дек 2015, 13:33
Romeo
Да, будет. Так как s был инициализирован. А список инициализации здесь при том, что этот самый s был инициализирован именно в нём, хоть и неявно. Если исключение полетит при инициализации одного из полей, то деструкторы будут вызваны только для тех полей, которые уже были инициализированы.
Код: Выделить всё
class Composite
{
Composite()
a1(),
a2(), // <---- exception here
a3()
{
// some code
}
private:
Aggreate1 a1;
Aggreate2 a2;
Aggreate3 a3;
}
Вот в таком случае:
- Для a1 будет вызван деструктор, так как a1 уже инициализирован на момент генерации исключения.
- Для a2 не будет вызван деструктор, так как объект, из конструктора которого полетело исключение инициализированным не считается.
- Для a3 не будет вызван деструктор, так как инициализация для него ещё не была выполнена.
Так же всё работает и для базовых классов.
А твой случай, когда исключение летит в теле конструктора самый простой и очевидный, так как если мы дошли до тела конструктора, то все поля класса уже инициализированы. Значит для всех них при генерации исключения будет вызван деструктор.