Динамические объекты в Qt? |
Здравствуйте, гость ( Вход | Регистрация )
Динамические объекты в 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 в деструкторах? Потому что у них есть родители, которые удаляют их при своем уничтожении. Простой пример:
|
|
|
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
Объект "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 |
В Qt вообще деструкторы редко используются. При том у них есть свой deleteLater(). RazrFalcon, уже столько дней с Qt, а азы не знаешь. Ответ: Потому что у них есть родители, которые удаляют их при своем уничтожении. Я имел в виду динамический объект верхнего уровня, то есть на вершине иерархии. а смысл его удалять? он удалится при закрытии программы средствами ОСьки
|
|
|
registr |
11.10.2011, 13:11
Сообщение
#7
|
Участник Группа: Участник Сообщений: 115 Регистрация: 16.11.2009 Пользователь №: 1234 Спасибо сказали: 8 раз(а) Репутация: 1 |
Потому как человек, который писал пример посчитал, что небольшая утечка памяти не критична? Неа, там если детальнее разобраться с примером, то получается, что действительно создается дерево объектов. А объект верхнего уровня создан в стеке, поэтому выйдя за область видимости он удалится и удалит все дерево. PS примеры написаны профессионально, просто, как это всегда бывает, надо было только подумать над ними а смысл его удалять? он удалится при закрытии программы средствами ОСьки Как люди говорят, это мовитон Действительно все объекты верхнего уровня создают в стеке, а не в куче, т.е. нединамически |
|
|
RazrFalcon |
11.10.2011, 16:52
Сообщение
#8
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
|
|
|
silver47 |
11.10.2011, 18:48
Сообщение
#9
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: 6 |
Цитата Как люди говорят, это мовитон Действительно все объекты верхнего уровня создают в стеке, а не в куче, т.е. нединамически Ой ли? мой же пример выше:
Где создается 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 включается в деверо, на вершине которого нединамический объектглавного окна. Короче объект верхненго уровня всегда нужно делать в стеке, а объекты-потомки в куче. У кого есть родители? Управление памятью с помощью дерева объектов http://doc.qt.nokia.com/latest/objecttrees.html Короче, есть объекты-родители и объекты-потомки, все они связаны в дерево объектов. На вершине иерархии -- объект верхненого уровня. Когда удаляется объект-родитель, то удаляются все его объекты-потомки. В частности там объясняется, почему объекты-потомки должны быть динамическими. А объект верхнего уровня нужно создавать в стеке. |
|
|
Текстовая версия | Сейчас: 28.11.2024, 16:14 |