crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

5 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
Litkevich Yuriy
  опции профиля:
сообщение 17.8.2010, 12:57
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Никак не могу въехать в виртуальный деструктор.
Есть некая программа написанная с использованием Qt, работает стабильно. При развитии программы, она может падать в некий момент времени, обычно при взаимодействии с пользовательским интерфейсом. Но чаще возникает авария при завершении работы.
Эту ситуацию можно пердотвратить в ведя в один из классов пустой, ничего не делающий, виртуальный деструктор.

Речь идёт о наследнике либо QObject, либо QWidget.

Может кто-нибудь объяснить, как может влиять создание руками виртуального деструктора, при условии, что его тело пустое?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 17.8.2010, 13:04
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Ситуация вообще странная.
Насколько я помню, виртуальный деструктор вводиться еще в QObject, т.е. все остальные деструкторы в наследниках (включая QWidget) по умолчанию виртуальные.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.8.2010, 13:14
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(BRE @ 17.8.2010, 17:04) Link
Насколько я помню, виртуальный деструктор вводиться еще в QObject,
да, но вот Креатор, например, генерит файлы классов всегда с явно указанным деструктором, если базовый класс является QObject/QWidget.

Я просто решил сделать по аналогии, в одной из программ. которая падает при закрытии. И программа перестала падать.

Как это работает я не пойму.

Если я правильно понимаю, то должно работать так. Дано:
class QObject
{
              QObject();
  virtual ~QObject();
};


class MyObject : public QObject
{
              MyObject();

}
где-то далее в коде:
QObject  *o = new MyObject();
delete o; // <--------
в выделенной строке должен вызываться деструктор класса MyObject

или я не прав?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 17.8.2010, 13:19
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Прав.
Вызовется деструтор MyObject, а потом QObject.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.8.2010, 13:27
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


и ещё, при отладке в Креаторе увидел что в консоль приложения печатается такая строка:
Lowest section in J:\WINDOWS\system32\xpsp2res.dll is .rsrc at 00011000

если же запускаю программу в командной строке виндовоза, то такой надписи нет. Это может предвещать что-то плохое?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.8.2010, 13:36
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Litkevich Yuriy, а когда запущено на отладку без точек останова - не видно, где падение произошло ? Обычно стек вызовов можно раскрутить до своего кода
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.8.2010, 13:42
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Алексей1153 @ 17.8.2010, 17:36) Link
Обычно стек вызовов можно раскрутить до своего кода
да вот GDB сволочной отладчик, когда нужно найти проблему, он руками разводит, говорит "Может стек корупт, а?"


Но походу тут лажа очередная с qmake'ом. Прибил всю сборку, собрал начисто, всё работает. Даже намёка на падение нет, что без деструктора, что с явно созданным.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 17.8.2010, 14:10
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


добавляя виртуальный деструктор получаем:
1) полиморфный класс, т.е. возможность использования dynamic_cast, typeid, ...
2) объекты можно удалять через указатель на базовый класс, при этом будет вызываться деструктор производного класса и корректно свобождается память.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 17.8.2010, 15:18
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Ежли мой склероз мне не изменяет, еще Джефф Элджер в своей "С++ Библиотека программиста" советовал: делайте деструктор всегда виртуальным, за исключением лишь тех случаев, когда есть чрезвычайно веские основания поступить иначе.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.8.2010, 15:20
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(DEADHUNT @ 17.8.2010, 18:10) Link
добавляя виртуальный деструктор получаем:
речь идёт о деструкторе базового класса или наследника?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

5 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 7.8.2025, 16:14