Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
DEADHUNT |
17.8.2010, 15:39
Сообщение
#11
|
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: 2
|
Цитата(Litkevich Yuriy @ 17.8.2010, 16:20) Link речь идёт о деструкторе базового класса или наследника? класс имеет виртуальный деструктор, т.е. в классе есть хотя бы один виртуальный метод, таким образом компилятор считает данный класс полиморфным, и обращается с ним иначе чем с обычными классами(как описано выше). |
|
|
|
|
Алексей1153 |
17.8.2010, 16:37
Сообщение
#12
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Цитата(Влад @ 17.8.2010, 18:18) Link за исключением лишь тех случаев, когда есть чрезвычайно веские основания поступить иначе о, я даже прошёлся по этим граблям разок ) Если интересно, могу вспомнить |
|
|
|
|
Litkevich Yuriy |
17.8.2010, 16:38
Сообщение
#13
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
Цитата(DEADHUNT @ 17.8.2010, 19:39) Link класс имеет виртуальный деструктор ну это-то понятно, это я в первых постах написал.Мне не понятно, может ли влиять явное создание пустого деструктора у наследника 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
|
Цитата(Litkevich Yuriy @ 17.8.2010, 19:38) Link Мне не понятно, может ли влиять явное создание пустого деструктора у наследника QObject (или иного класса, с виртуальным деструктором). На мой взгляд нет. однозначно нет. скорее всего, ошибка в потоках, либо в оставшихся "висящими" объектах ядра. проверяй, все ли ресурсы освобождаются корректно, правильно ли завершаются потоки, нет ли "подвисших" линков на несуществующие переменные после закрытия основного потока. |
|
|
|
|
Алексей1153 |
17.8.2010, 18:41
Сообщение
#16
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
и ещё
... вызываются ли виртуальные функции в деструкторе (низя) ... производится ли где-то явное приведение типа с последующим изменением начала объекта (бьётся таблица виртуальных функций) |
|
|
|
|
BRE |
17.8.2010, 19:00
Сообщение
#17
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44
|
Цитата(Алексей1153 @ 17.8.2010, 19:41) Link ... вызываются ли виртуальные функции в деструкторе (низя) Почему нельзя? |
|
|
|
|
kwisp |
17.8.2010, 19:08
Сообщение
#18
|
|
астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23
|
BRE,
не знаю почему но могу предположить: при вызове вирт. диструктора вызывается на самом деле деструктор производного объекта(уничтожает поля производного класса) , который в свою очередь вызывает деструктор базового класса(тот самый виртуальный) ав нем виртуальные функции которые могут использовать уже удаленные поля производного класса... по моему логично если диструктор не виртуальный а в нем виртуальные функции то эти вирту функции напросто обратятся уже к удаленным полям производного объекта. порядок вызова деструкторов обратный то |
|
|
|
|
Алексей1153 |
17.8.2010, 19:11
Сообщение
#19
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 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 будет переключена на таблицу базового класса и будет вызван его деструктор и т.д. Даже если ты будешь удалять объект по указателю на его базовый класс. В этом и смысл.
А вот с конструкторами такое не пройдет, они не могут быть виртуальными. Поэтому, в конструкторе будет вызван виртуальный метод того класса, конструктор которого в данный момент работает, даже если в производном классе он переопределен. |
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 22.12.2025, 9:49 |