29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
|
||||||
1 | ||||||
Почему вызывается деструктор?28.07.2016, 11:32. Показов 1569. Ответов 14
Метки нет (Все метки)
Доброго времени суток. Написал такой код:
Более того. Загнал этот код в онлайн компилятор. Если поставить стандарт 98, то деструктор вызывается. Если х11 или х14, то не вызывается. Почему так? Ведь по выходу из области видимости разрушается переменная obj и вызывается её деструктор. Сначала деструктор класса Ex, после которого должен быть вызван деструктор класса O. Но вызывается исключение и до деструктора O дело дойти не должно. В чём я ошибаюсь / чего не вижу?
0
|
28.07.2016, 11:32 | |
Ответы с готовыми решениями:
14
Почему не вызывается деструктор? Объясните почему вызывается деструктор Почему деструктор вызывается два раза Почему виртуальный деструктор вызывается дважды? |
134 / 104 / 60
Регистрация: 26.10.2013
Сообщений: 312
|
|
28.07.2016, 11:50 | 2 |
Никогда не позволяйте исключениям покидать деструктор. Никогда.
За подробностями к Скотту Мейерсу.
0
|
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
|
|
28.07.2016, 12:03 [ТС] | 3 |
Так не. Я вроде слышал, что не стоит позволять. Но это что UB? Пример чисто учебный, чтобы разобраться как вообще обстоят дела.
0
|
134 / 104 / 60
Регистрация: 26.10.2013
Сообщений: 312
|
|
28.07.2016, 12:18 | 4 |
В C++11 и 14 все деструкторы неявно помечены как noexcept. Если исключение покидает деструктор, программа аварийно завершается.
Не помню про 98, там скорее всего деструктор неявно помечен как throw(). Думаю, этого достаточно чтобы понять, что ваш код не имеет смысла.
0
|
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
|
|
28.07.2016, 12:30 [ТС] | 5 |
Спасибо, про noexcept я почитал. Теперь понял. Также понял примерно чем грозит "покидание исключением деструктора". Но мне так и не ясно, почему в 98 вызывается деструктор базового класса. throw 1, заставляет искать первый блок try-catch. находит. и что, пытается уничтожить базовую часть объекта obj? то есть получается, что для одной переменной вызывается деструтор два раза?
0
|
134 / 104 / 60
Регистрация: 26.10.2013
Сообщений: 312
|
|
28.07.2016, 12:40 | 6 |
0
|
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
|
|
28.07.2016, 12:54 [ТС] | 8 |
HelicopterK52, спасибо. Мне всегда казалось, что исключение в деструкторе черевато прежде всего тем, что не будут вызваны деструкторы базовых классов. А получается, что в 98ом деструкторы базовых вызываются, а в 11ом и вовсе программа завершается принудительно
0
|
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
|
|
28.07.2016, 13:28 [ТС] | 10 |
Так в моём случае, деструктор вызывается просто. его вызов - это просто окончание действия переменной. но ведь всё равно аварийно закрывается
0
|
28.07.2016, 13:29 | 11 | |||||
В c++03 - не завершится:
Начиная с c++11, деструкторы по дефолту являются noexcept, вылет исключения из noexcept функции (не обязательно из деструктора), приводит к вызову std::terminate.
0
|
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
|
|
28.07.2016, 13:34 [ТС] | 12 |
Всё, кажется я окончательно разобрался. Вопросов пока нет))) Голову можно сломать. Неужели в реальной жизни так часто встречаются такие ситуации? Или просто это тема из разряда "если программист это знает, то когда-нибудь, один раз в жизни ему попадется нечто подобное и он будет знать, куда копать" ?
0
|
28.07.2016, 13:37 | 13 |
Какие именно? Вызов исключений в деструкторах? Тут сразу смерть приходит, так что забывать в деструкторе о проверках не нужно.
В принципе, он и так должен знать куда копать.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
28.07.2016, 14:41 | 14 |
нет)
в реально жизни никто эксепшены и деструкторах не кидает) а если даже и кидают, то в самом деструкторе ставиццо ловушка, которая не дает эксепшенам просочиццо наружу. и как бе проблем никаких)
0
|
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
|
|
28.07.2016, 14:55 [ТС] | 15 |
ну я понял. всем большое спасибо
0
|
28.07.2016, 14:55 | |
28.07.2016, 14:55 | |
Помогаю со студенческими работами здесь
15
Почему при помещении объекта в list вызывается конструктор и деструктор? При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О Не вызывается деструктор Деструктор не вызывается Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |