Исключение в деструкторе - вопрос
От: Haccel  
Дата: 24.05.11 06:05
Оценка:
Вопрос к профам.
Будут ли утечки если выкину исключение в деструкторе объекта, при условии что данный объект всегда создаётся на стеке (не в куче)?
Ведь стек должен гарантировано очищаться при выходе из него.
Спасибо.
Re: Исключение в деструкторе - вопрос
От: Centaur Россия  
Дата: 24.05.11 06:37
Оценка:
Здравствуйте, Haccel, Вы писали:

H>Будут ли утечки если выкину исключение в деструкторе объекта, при условии что данный объект всегда создаётся на стеке (не в куче)?


class Evil
{
public:
    ~Evil() { throw 0; }
};

void foo(bool tralala)
{
    Evil evil;

    if (tralala) throw 1;
}


Как всё будет: Сначала создастся экземпляр злого класса. Потом выполнится проверка на траляля, обнаружит, что всё плохо, и выкинет 1. Начнётся размотка стека. Вызовется деструктор злого класса. Выбрасывает ещё и 0 — неопределённое поведение (выброс исключения во время размотки стека из-за другого исключения).

Утечки могут быть, могут не быть, может отформатироваться винчестер или взорваться блок питания.
Re: Исключение в деструкторе - вопрос
От: migel  
Дата: 24.05.11 07:10
Оценка: -1
Здравствуйте, Haccel, Вы писали:

H>Ведь стек должен гарантировано очищаться при выходе из него.

H>Спасибо.
Исключения в деструктарах — ТАБУ!
Re[2]: Исключение в деструкторе - вопрос
От: uzhas Ниоткуда  
Дата: 24.05.11 07:57
Оценка: +1
Здравствуйте, 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 я не рассматриваю, хотя это главная причина, почему из деструкторов разумные разработчики не кидают исключения)
Re[2]: Исключение в деструкторе - вопрос
От: Haccel  
Дата: 24.05.11 08:53
Оценка:
Здравствуйте, migel, Вы писали:

M>Здравствуйте, Haccel, Вы писали:


H>>Ведь стек должен гарантировано очищаться при выходе из него.

H>>Спасибо.
M>Исключения в деструктарах — ТАБУ!

Снимаю шляпу. Всем спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.