![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
borisbn |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Здравствуйте. Столкнулся с тем, что gcc на такой код
даёт такой warning
Если бы я написал delete a; - у меня бы не было вопросов, в чём я не прав - в Base нужно добавить вирт.деструктор... это понятно. Непонятно следующее - откуда в приведённом коде UB ? Я тут немного поэкспериментировал - добавил в Base и в Deriv классик, который печатает что-то в своём конструкторе и деструкторе - отрабатывают все 4
http://liveworkspace.org/code/f476a3f7cf08...929fee22c25af52 Вывод
Вопрос: если не вызывать в явную деструктор базового класса, то в чём же тут UB ? Спасибо. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||||
|
|||||||||
boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
эта проверка появилась вроде только в 4.7.2, если не ошибаюсь. ну ,компилятор справедливо предполагает, что раз уж ты используешь new, то где-то должен быть delete ;)
насколько мне известно, наследники виртуальных классов обязаны реализовывать свой виртуальный деструктор. а что там по стандарту - я хз. |
||||
|
|||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
хммм. добавил virtual в деструктор Deriv и warning пропал... чего-то я недопонимаю ![]() Если в базовом нет вирт.деструктора, то какая разница виртуальный он в наследнике или нет. ![]() Это сообщение отредактировал(а) borisbn - 6.10.2012, 13:51 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
При наличии деструктора у потомка и неперегружэнного destroy(), этот destroy() вызовет не тот деструктор.
|
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
может поэтому?
http://liveworkspace.org/code/b65e4d394e7c...284536b3441c5b5 -------------------- вопросов больше чем ответов |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Спасибо. Понятно.
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |