C++, виртуальный деструктор |
Здравствуйте, гость ( Вход | Регистрация )
C++, виртуальный деструктор |
DEADHUNT |
17.8.2010, 15:39
Сообщение
#11
|
Активный участник Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: 2 |
речь идёт о деструкторе базового класса или наследника?
класс имеет виртуальный деструктор, т.е. в классе есть хотя бы один виртуальный метод, таким образом компилятор считает данный класс полиморфным, и обращается с ним иначе чем с обычными классами(как описано выше). |
|
|
Алексей1153 |
17.8.2010, 16:37
Сообщение
#12
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
|
|
|
Litkevich Yuriy |
17.8.2010, 16:38
Сообщение
#13
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
класс имеет виртуальный деструктор ну это-то понятно, это я в первых постах написал.Мне не понятно, может ли влиять явное создание пустого деструктора у наследника QObject (или иного класса, с виртуальным деструктором). На мой взгляд нет. Но похоже это какая-то кривость Креатора. Любое изменение в коде (в заголовочниках) сейчас опять выливается в аврию. Если же компилю в консоли или в PN-2, то всё нормально. |
|
|
kwisp |
17.8.2010, 17:07
Сообщение
#14
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
лишний повод(причина) не использовать креатор.
|
|
|
Iron Bug |
17.8.2010, 17:53
Сообщение
#15
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Мне не понятно, может ли влиять явное создание пустого деструктора у наследника QObject (или иного класса, с виртуальным деструктором). На мой взгляд нет. однозначно нет. скорее всего, ошибка в потоках, либо в оставшихся "висящими" объектах ядра. проверяй, все ли ресурсы освобождаются корректно, правильно ли завершаются потоки, нет ли "подвисших" линков на несуществующие переменные после закрытия основного потока. |
|
|
Алексей1153 |
17.8.2010, 18:41
Сообщение
#16
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
и ещё
... вызываются ли виртуальные функции в деструкторе (низя) ... производится ли где-то явное приведение типа с последующим изменением начала объекта (бьётся таблица виртуальных функций) |
|
|
BRE |
17.8.2010, 19:00
Сообщение
#17
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
|
|
|
kwisp |
17.8.2010, 19:08
Сообщение
#18
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
BRE,
не знаю почему но могу предположить: при вызове вирт. диструктора вызывается на самом деле деструктор производного объекта(уничтожает поля производного класса) , который в свою очередь вызывает деструктор базового класса(тот самый виртуальный) ав нем виртуальные функции которые могут использовать уже удаленные поля производного класса... по моему логично если диструктор не виртуальный а в нем виртуальные функции то эти вирту функции напросто обратятся уже к удаленным полям производного объекта. порядок вызова деструкторов обратный то |
|
|
Алексей1153 |
17.8.2010, 19:11
Сообщение
#19
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Вроде нельзя, потому что виртуальная таблица уже порушена. Будут вызываться функции данного объекта, а не потомков
А как там в стандарте ? Надо будет эксперимент поставить, но щас у меня мысль в другом русле, пока не могу ) Сообщение отредактировал Алексей1153 - 17.8.2010, 19:13 |
|
|
BRE |
17.8.2010, 19:20
Сообщение
#20
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
На сколько я помню, при удалении объекта с виртуальным деструктором, будет вызван деструктор из его vtbl. После его отработки, vtbl будет переключена на таблицу базового класса и будет вызван его деструктор и т.д. Даже если ты будешь удалять объект по указателю на его базовый класс. В этом и смысл.
А вот с конструкторами такое не пройдет, они не могут быть виртуальными. Поэтому, в конструкторе будет вызван виртуальный метод того класса, конструктор которого в данный момент работает, даже если в производном классе он переопределен. |
|
|
Текстовая версия | Сейчас: 27.11.2024, 8:39 |