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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
#1

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

18.09.2012, 15:46. Просмотров 2476. Ответов 7
Метки нет (Все метки)

В одном учебнике встретилась такая фраза:
Если деструктор, вызванный в процессе разматывания стека, выбрасывает исключение, вызывается
terminate.

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

Деструкторы - C++
Вообщем сразу к сути. В нижеприведенном примере вызывается 2 деструктора. Я никак не пойму, почему именно два? вот сам метод: ...

Деструкторы - C++
Всем доброго времени суток! Возникли некоторые непонятки с деструкторами, а точнее их время вызова и механизм работы. Вот код: ...

Деструкторы - C++
Не совсем понятно, по какой все таки причине разработчики C++ отказались от возможности иметь деструкторы с аргументами, то есть передавать...

Виртуальные деструкторы - C++
#include <iostream> using namespace std; class first { public: first(); virtual ~first(){delete pointer;} virtual void...

Конструкторы и деструкторы - C++
Код: #include <iostream> #include <stdlib.h> #include <conio.h> class complex { private: double im; double...

Конструкторы и деструкторы - C++
Привет. Есть структура, содержащая 7 полей, в которые я ввожу значения с клавиатуры. Нужно используя конструкторы и деструкторы...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
18.09.2012, 15:55 #2
Можно и нужно. Именно если не словить исключение с помощью try–catch, может случиться беда.

Если просто в деструкторе, то часть деструкторов может не выполниться из-за этого. Если в процессе раскрутки стека, вызванного другим исключением, то тут нельзя однозначно сказать, какому из двух исключений (выброшенному деструктором или тому, которое вызвало этот деструктор в процессе раскрутки) отдать приоритет. Поэтому это запрещено.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
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
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
18.09.2012, 17:14 #5
Угу. Стоит вообще не выпускать исключения из деструкторов. Боюсь, если что-то сломалось в процессе удаления объекта, то это всё, приехали. Их нельзя никак вменяемо обработать вне уничтожаемого объекта, потому что этот объект уже наполовину разобран и в кишки ему не залезешь, чтобы довершить начатое. Лучшее, что можно сделать: разве что записать в лог, что где сломалось, и начать процедуру спасения всего, что можно, с последующим рестартом.
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
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
18.09.2012, 22:40 #7
Это тоже раскрутка стека, только на один фрейм, а не на несколько, как (обычно) в случае проброса исключения до catch.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
18.09.2012, 23:18 #8
Тут скорей всего имеется ввиду, что при раскрутки стека, если выбрасывается исключение в каком либо декструкторе объекта ( например при уничтожении локальных объектов ), то никакие try catch уже не помогут, сразу же вызывается terminate.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2012, 23:18
Привет! Вот еще темы с ответами:

Конструкторы/Деструкторы - C++
Доброго времени суток! Есть проблемка... после выполнении программа вылетает (без ошибок, просто выбивает в Windows программирую на BC...

Конструкторы и деструкторы - C++
Напишите простейшие примеры объявления и определения конструкторов и деструкторов. Желательно, чтобы были примеры с различными типами данных

Конструкторы и деструкторы - C++
Здравствуйте уважаемые программисты, помогите пожалуйста новичку? Не могу разобраться в программе, где смог там написал комментарий и то не...

Конструкторы и деструкторы - C++
Прочитал про конструкторы и деструкторы. Пишут что они нужны для инициализации переменных класса. Как они используются я понял, но не понял...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.09.2012, 23:18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru