![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Litkevich Yuriy |
![]()
Сообщение
#1
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Никак не могу въехать в виртуальный деструктор.
Есть некая программа написанная с использованием Qt, работает стабильно. При развитии программы, она может падать в некий момент времени, обычно при взаимодействии с пользовательским интерфейсом. Но чаще возникает авария при завершении работы. Эту ситуацию можно пердотвратить в ведя в один из классов пустой, ничего не делающий, виртуальный деструктор. Речь идёт о наследнике либо QObject, либо QWidget. Может кто-нибудь объяснить, как может влиять создание руками виртуального деструктора, при условии, что его тело пустое? |
|
|
BRE |
![]()
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Ситуация вообще странная.
Насколько я помню, виртуальный деструктор вводиться еще в QObject, т.е. все остальные деструкторы в наследниках (включая QWidget) по умолчанию виртуальные. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#3
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Насколько я помню, виртуальный деструктор вводиться еще в QObject, да, но вот Креатор, например, генерит файлы классов всегда с явно указанным деструктором, если базовый класс является QObject/QWidget.Я просто решил сделать по аналогии, в одной из программ. которая падает при закрытии. И программа перестала падать. Как это работает я не пойму. Если я правильно понимаю, то должно работать так. Дано: где-то далее в коде: в выделенной строке должен вызываться деструктор класса MyObjectили я не прав? |
|
|
BRE |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Прав.
Вызовется деструтор MyObject, а потом QObject. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#5
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
и ещё, при отладке в Креаторе увидел что в консоль приложения печатается такая строка:
если же запускаю программу в командной строке виндовоза, то такой надписи нет. Это может предвещать что-то плохое? |
|
|
Алексей1153 |
![]()
Сообщение
#6
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Litkevich Yuriy, а когда запущено на отладку без точек останова - не видно, где падение произошло ? Обычно стек вызовов можно раскрутить до своего кода
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#7
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Обычно стек вызовов можно раскрутить до своего кода да вот GDB сволочной отладчик, когда нужно найти проблему, он руками разводит, говорит "Может стек корупт, а?"Но походу тут лажа очередная с qmake'ом. Прибил всю сборку, собрал начисто, всё работает. Даже намёка на падение нет, что без деструктора, что с явно созданным. |
|
|
DEADHUNT |
![]()
Сообщение
#8
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
добавляя виртуальный деструктор получаем:
1) полиморфный класс, т.е. возможность использования dynamic_cast, typeid, ... 2) объекты можно удалять через указатель на базовый класс, при этом будет вызываться деструктор производного класса и корректно свобождается память. |
|
|
Влад |
![]()
Сообщение
#9
|
Участник ![]() ![]() Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: ![]() ![]() ![]() |
Ежли мой склероз мне не изменяет, еще Джефф Элджер в своей "С++ Библиотека программиста" советовал: делайте деструктор всегда виртуальным, за исключением лишь тех случаев, когда есть чрезвычайно веские основания поступить иначе.
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 17.2.2025, 12:01 |