Russian Qt Forum
Ноябрь 12, 2024, 02:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT: new & delete  (Прочитано 6950 раз)
Alp
Гость
« : Сентябрь 16, 2009, 12:59 »

Вероятно, подобные вопросы уже задавались, но поиском ничего подходящего не нашел.

Во всех примерах виджеты создаются через operator new, но нигде не удаляются соответствующим оператором delete. Догадываюсь, что у троллей new и delete обернуты во что-то свое, но как и где? В qt/src/gui пусто. Что будет если я начну писать деструкторы и удалять там руками созданные контролы?

Как же это реализовано? Можно ссылками, можно ключевыми словами для поиска, выдающими нужную тему.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Сентябрь 16, 2009, 13:09 »

Цитировать
QObject::~QObject ()   [virtual]

Destroys the object, deleting all its child objects.

All signals to and from the object are automatically disconnected, and any pending posted events for the object are removed from the event queue. However, it is often safer to use deleteLater() rather than deleting a QObject subclass directly.

Warning: All child objects are deleted. If any of these objects are on the stack or global, sooner or later your program will crash. We do not recommend holding pointers to child objects from outside the parent. If you still do, the destroyed() signal gives you an opportunity to detect when an object is destroyed.

Warning: Deleting a QObject while pending events are waiting to be delivered can cause a crash. You must not delete the QObject directly if it exists in a different thread than the one currently executing. Use deleteLater() instead, which will cause the event loop to delete the object after all pending events have been delivered to it.
Записан
Alp
Гость
« Ответ #2 : Сентябрь 16, 2009, 13:57 »

Хорошо, для кода типа
Код
C++ (Qt)
   QApplication a(argc, argv);
   MainWindow w;
   w.show();
   return a.exec();
 
это понятно. Но если я его немного видоизменю:
Код
C++ (Qt)
   QApplication a(argc, argv);
   MainWindow *w = new MainWindow;
   w->show();
   return a.exec();
 
то получу утечку памяти в виде всех потомков MainWindow, так?
Записан
Alp
Гость
« Ответ #3 : Сентябрь 16, 2009, 14:04 »

Вдогонку, еще вопрос про QPixmap. В объявлении класса есть QPixmap *pix, в имплементации этот пиксмап создается. Но такого понятия как "предок" у пиксмапа нет. Значит ли это, что после уничтожения класса этот пиксмап останется не удаленным?
Записан
BRE
Гость
« Ответ #4 : Сентябрь 16, 2009, 14:06 »

то получу утечку памяти в виде всех потомков MainWindow, так?
В данном примере все ресурсы (включая память) будут возвращены системе после завершения программы. Побочный эффект будет в том, что не будут вызваны деструкторы для MainWindow и всех его детей.

Значит ли это, что после уничтожения класса этот пиксмап останется не удаленным?
Значит. Если нет владельца, удаляй сам.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.203 секунд. Запросов: 23.