Форум программистов, компьютерный форум CyberForum.ru

Деструкторы и исключения - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
18.09.2012, 15:46     Деструкторы и исключения #1
В одном учебнике встретилась такая фраза:
Если деструктор, вызванный в процессе разматывания стека, выбрасывает исключение, вызывается
terminate.

Означает ли это, что в деструкторах невозможно использовать операторы try catch?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2012, 15:46     Деструкторы и исключения
Посмотрите здесь:

C++ Конструкторы/Деструкторы
C++ Конструкторы и деструкторы
C++ Деструкторы
Где деструкторы? C++
C++ Деструкторы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
18.09.2012, 15:55     Деструкторы и исключения #2
Можно и нужно. Именно если не словить исключение с помощью try–catch, может случиться беда.

Если просто в деструкторе, то часть деструкторов может не выполниться из-за этого. Если в процессе раскрутки стека, вызванного другим исключением, то тут нельзя однозначно сказать, какому из двух исключений (выброшенному деструктором или тому, которое вызвало этот деструктор в процессе раскрутки) отдать приоритет. Поэтому это запрещено.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
18.09.2012, 15:57     Деструкторы и исключения #3
Нет, это как раз говорит об обратном - что в деструкторах использовать try-catch полезно. Любая функция, вызываемая в теле сколько-нибудь нетривиального деструктора, может выбросить исключение. Это исключение не должно выйти за пределы деструктора, если же это все-таки произойдет, тогда гарантируется terminate и крах. Вот тут-то и нужны try-catch. :-)
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
18.09.2012, 16:45  [ТС]     Деструкторы и исключения #4
Следует ли это понимать, как если обработчик исключений в данном деструкторе до конца не обработает возникшее исключение, то тогда надеяться на то, что обработчик исключений в деструкторе родительского объекта завершит обработку, не стоит?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
18.09.2012, 17:14     Деструкторы и исключения #5
Угу. Стоит вообще не выпускать исключения из деструкторов. Боюсь, если что-то сломалось в процессе удаления объекта, то это всё, приехали. Их нельзя никак вменяемо обработать вне уничтожаемого объекта, потому что этот объект уже наполовину разобран и в кишки ему не залезешь, чтобы довершить начатое. Лучшее, что можно сделать: разве что записать в лог, что где сломалось, и начать процедуру спасения всего, что можно, с последующим рестартом.
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
18.09.2012, 22:30     Деструкторы и исключения #6
Кроме того, экзепшн внутри деструктора может привести к неопределенному поведению кучи других обьектов. Допустим в функции
C++
1
2
3
Foo f[10];
// Тут чета происходит
return;
Вот в момент ретюрна обьекты начинают уничтожаться. Допустим один из них кидает исключение. Что дальше делать? Половина уже уничтожена, один в неизвестном состоянии кишками наружу, оставшая часть еще не уничтожена. Выйти из функции до ближайшего try-catch? Но тогда мы должны уничтожить все оставшиеся в scope обьекты. А если они тоже кинут исключение? С++ не умеет обрабатывать 2 исключения одновременно. Короче, есть договоренность что деструкторы всегда должны быть exception-safe
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
18.09.2012, 22:40     Деструкторы и исключения #7
Это тоже раскрутка стека, только на один фрейм, а не на несколько, как (обычно) в случае проброса исключения до catch.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2012, 23:18     Деструкторы и исключения
Еще ссылки по теме:

C++ Конструкторы и деструкторы
Деструкторы C++
C++ Виртуальные деструкторы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
18.09.2012, 23:18     Деструкторы и исключения #8
Тут скорей всего имеется ввиду, что при раскрутки стека, если выбрасывается исключение в каком либо декструкторе объекта ( например при уничтожении локальных объектов ), то никакие try catch уже не помогут, сразу же вызывается terminate.
Yandex
Объявления
18.09.2012, 23:18     Деструкторы и исключения
Ответ Создать тему
Опции темы

Текущее время: 16:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru