crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Динамические объекты в Qt?
registr
  опции профиля:
сообщение 10.10.2011, 18:37
Сообщение #1


Участник
**

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

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




Репутация:   1  


Как подчищаются динамические объекты (через new)? Освобождается память операционной системой или какими-то Qt-шными средствами?

Перефразирую вопрос. Почему в Qt Examples and Demos динамические объекты не удалаются через delete в деструкторах?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 10.10.2011, 19:12
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Чистим через delete и delete[].
В примерах нет, да. ХЗ почему. В Qt вообще деструкторы редко используются.
При том у них есть свой deleteLater().

Также можно юзать умные указатели. Кьютешные.
http://developer.qt.nokia.com/wiki/Smart_Pointers_Russian
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 10.10.2011, 19:20
Сообщение #3


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

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

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




Репутация:   6  


Цитата
Почему в Qt Examples and Demos динамические объекты не удалаются через delete в деструкторах?


Потому что у них есть родители, которые удаляют их при своем уничтожении. Простой пример:
MyWidget::MyWidget(QWidget *parent) : QWidget(parent){
  QVBoxLayout *mainLay = new QVBoxLayout(this); // создаю главный лэйаут и присваиваю ему родителем текущий класс, при уничтожении класса этот лэйатут будет уничтожен

  mainLai->addWidget(new QLabel("А это простой элемент, внутри лэйатуа"\n"Он будет уничтожен при уничтожении лэйатуа автоматически"));

  this->setLayout(mainLay);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 10.10.2011, 20:20
Сообщение #4


Участник
**

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

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




Репутация:   1  


Цитата
Потому что у них есть родители, которые удаляют их при своем уничтожении. Простой пример:

Я имел в виду динамический объект верхнего уровня, то есть на вершине иерархии.

Например, Qt 4.7 Examles and Demos, OpenGL, Hello GL Example

Там есть два класса GLWidget и Window. Я цитирую файл window.cpp
    
Window::Window()
{
   glWidget = new GLWidget;

Объект "glWidget" динамический, но он не объект-потомок. Нужно либо указать, что он объект-потомок
Window::Window()
{
   glWidget = new GLWidget(this);

либо удалить его в деструкторе
    
Window::~Window()
{
   delete glWidget;


Но этого в примере нет. Я не понимаю почему.

Вообщем разобрался :)

Сообщение отредактировал registr - 10.10.2011, 19:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 11.10.2011, 5:06
Сообщение #5


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

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

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




Репутация:   6  


Потому как человек, который писал пример посчитал, что небольшая утечка памяти не критична?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.10.2011, 7:37
Сообщение #6


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

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

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




Репутация:   94  


Цитата(RazrFalcon @ 10.10.2011, 22:12) *
В Qt вообще деструкторы редко используются.
При том у них есть свой deleteLater().

RazrFalcon, уже столько дней с Qt, а азы не знаешь.
Ответ:
Цитата(silver47 @ 10.10.2011, 22:20) *
Потому что у них есть родители, которые удаляют их при своем уничтожении.


Цитата(registr @ 10.10.2011, 23:20) *
Я имел в виду динамический объект верхнего уровня, то есть на вершине иерархии.
а смысл его удалять? он удалится при закрытии программы средствами ОСьки
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 11.10.2011, 13:11
Сообщение #7


Участник
**

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

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




Репутация:   1  


Цитата(silver47 @ 11.10.2011, 5:06) *
Потому как человек, который писал пример посчитал, что небольшая утечка памяти не критична?

Неа, там если детальнее разобраться с примером, то получается, что действительно создается дерево объектов. А объект верхнего уровня создан в стеке, поэтому выйдя за область видимости он удалится и удалит все дерево.

PS примеры написаны профессионально, просто, как это всегда бывает, надо было только подумать над ними :)

Цитата(Litkevich Yuriy @ 11.10.2011, 8:37) *
а смысл его удалять? он удалится при закрытии программы средствами ОСьки

Как люди говорят, это мовитон :) Действительно все объекты верхнего уровня создают в стеке, а не в куче, т.е. нединамически
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 11.10.2011, 16:52
Сообщение #8


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Цитата(Litkevich Yuriy @ 11.10.2011, 7:37) *
RazrFalcon, уже столько дней с Qt, а азы не знаешь.

Есть немного :mellow:


Цитата
Потому что у них есть родители, которые удаляют их при своем уничтожении.

У кого есть родители?

Сообщение отредактировал RazrFalcon - 11.10.2011, 17:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 11.10.2011, 18:48
Сообщение #9


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

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

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




Репутация:   6  


Цитата
Как люди говорят, это мовитон Действительно все объекты верхнего уровня создают в стеке, а не в куче, т.е. нединамически


Ой ли? мой же пример выше:
MyWidget::MyWidget(QWidget *parent) : QWidget(parent){
  QVBoxLayout *mainLay = new QVBoxLayout(this);
}

Где создается mainLay на стеке или на куче? Чего с ним будет, когда мы выйдем за пределы видимости? Верный ответ здесь:
Цитата
он удалится при закрытии программы средствами ОСьки


Или Вы вообще про объект MyWidget?

Сообщение отредактировал silver47 - 11.10.2011, 18:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 11.10.2011, 20:35
Сообщение #10


Участник
**

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

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




Репутация:   1  


Цитата
Или Вы вообще про объект MyWidget?

Да-да, объект MyWidget нужно создавать нединамически, или же если есть главное окно, то тогда динамический объект класса MyWidget включается в деверо, на вершине которого нединамический объектглавного окна. Короче объект верхненго уровня всегда нужно делать в стеке, а объекты-потомки в куче.

Цитата(RazrFalcon @ 11.10.2011, 17:52) *
У кого есть родители?

Управление памятью с помощью дерева объектов
http://doc.qt.nokia.com/latest/objecttrees.html
Короче, есть объекты-родители и объекты-потомки, все они связаны в дерево объектов. На вершине иерархии -- объект верхненого уровня. Когда удаляется объект-родитель, то удаляются все его объекты-потомки. В частности там объясняется, почему объекты-потомки должны быть динамическими. А объект верхнего уровня нужно создавать в стеке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 1.12.2024, 9:55