Здравствуйте, Centaur, Вы писали:
C> Выбрасывает ещё и 0 — неопределённое поведение (выброс исключения во время размотки стека из-за другого исключения).
это вполне определенное поведение — terminate
http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr163.htm
по теме: зависит от объекта и от того, где именно вы бросаете исключение (случаи с double exception я не рассматриваю, хотя это главная причина, почему из деструкторов разумные разработчики не кидают исключения)
Вопрос к профам.
Будут ли утечки если выкину исключение в деструкторе объекта, при условии что данный объект всегда создаётся на стеке (не в куче)?
Ведь стек должен гарантировано очищаться при выходе из него.
Спасибо.
Здравствуйте, Haccel, Вы писали:
H>Будут ли утечки если выкину исключение в деструкторе объекта, при условии что данный объект всегда создаётся на стеке (не в куче)?
class Evil
{
public:
~Evil() { throw 0; }
};
void foo(bool tralala)
{
Evil evil;
if (tralala) throw 1;
}
Как всё будет: Сначала создастся экземпляр злого класса. Потом выполнится проверка на траляля, обнаружит, что всё плохо, и выкинет 1. Начнётся размотка стека. Вызовется деструктор злого класса. Выбрасывает ещё и 0 — неопределённое поведение (выброс исключения во время размотки стека из-за другого исключения).
Утечки могут быть, могут не быть, может отформатироваться винчестер или взорваться блок питания.