| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > delete object with non-virtual destructor = UB ? |
| Автор: borisbn 6.10.2012, 11:57 | ||||||||
Здравствуйте. Столкнулся с тем, что gcc на такой код
даёт такой warning
Если бы я написал delete a; - у меня бы не было вопросов, в чём я не прав - в Base нужно добавить вирт.деструктор... это понятно. Непонятно следующее - откуда в приведённом коде UB ? Я тут немного поэкспериментировал - добавил в Base и в Deriv классик, который печатает что-то в своём конструкторе и деструкторе - отрабатывают все 4
http://liveworkspace.org/code/f476a3f7cf08e0da9929fee22c25af52 Вывод
Вопрос: если не вызывать в явную деструктор базового класса, то в чём же тут UB ? Спасибо. |
| Автор: borisbn 6.10.2012, 13:50 | ||
хммм. добавил virtual в деструктор Deriv и warning пропал... чего-то я недопонимаю Если в базовом нет вирт.деструктора, то какая разница виртуальный он в наследнике или нет. |
| Автор: boostcoder 6.10.2012, 14:31 | ||
в базовом он быть не обязан. а в наследниках обязан. не знаю как объяснить, почему. а своими словами объяснять долго... |
| Автор: tzirechnoy 6.10.2012, 19:10 |
| При наличии деструктора у потомка и неперегружэнного destroy(), этот destroy() вызовет не тот деструктор. |
| Автор: Леопольд 6.10.2012, 21:40 | ||
может поэтому?
http://liveworkspace.org/code/b65e4d394e7c26e0b284536b3441c5b5 |
| Автор: borisbn 7.10.2012, 07:45 |
| Спасибо. Понятно. |