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

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

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: как правильно работать с Qt, чтобы не было утечек памяти?  (Прочитано 59907 раз)
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #45 : Декабрь 06, 2023, 10:34 »

Да уж наворотили в Qt всего Подмигивающий.

Архитектура Qt закладывалась во времена без unique_ptr, shared_ptr и move семантики.
Но вопросы владения ресурсами и механизм RAII никто не отменял.

Как разработчик будет управлять  ресурсами - это его дело.
Можно new/delete использовать и сырые указатели (типа классические), но это трудоемко в плане подчистки ресурсов. Как минимум нужно в деструкторе удалить, а желательно ещё учесть возможность обработки исключений. Умные указатели unique_ptr, shared_ptr и другие решают задачу подчистки ресурсов, с ними проще.

Разработчики Qt в своей архитектуре смешали вопрос иерархии экземпляров объектов и вопрос владения, заложив правило, что верхний в иерархии объект удаляет объекты ниже в иерархии. Это привело к тому, что в Qt традиционно используют сырые указатели. Тем не менее, сами разработчики Qt рекомендуют использовать unique_ptr для управления ресурсами (стандартный почти аналог QScopedPointer).

При использовании сырых указателей классической ошибкой новичков является не указание родителя у экземпляра объекта (чаще всего this)

Код
C++ (Qt)
QObject * obj = new QObject; // должно быть QObject( this )
 

В этом случае никто не владеет объектом, куда указывает obj => потенциальные утечки ресурсов памяти.

В случае с умным указателем

Код
C++ (Qt)
unique_ptr< QObject > obj = make_unique< QObject >();
 

ресурсом владеет умный указатель, который в любом случае удалит объект, на который указывает obj.
Записан
Igor_S
Новичок

Offline Offline

Сообщений: 9


Просмотр профиля
« Ответ #46 : Декабрь 09, 2023, 13:30 »

Разработчики Qt в своей архитектуре смешали вопрос иерархии экземпляров объектов и вопрос владения, заложив правило, что верхний в иерархии объект удаляет объекты ниже в иерархии. Это привело к тому, что в Qt традиционно используют сырые указатели.
Не вижу ничего плохого а этом правиле. Ну хорошо, а как же должна выглядеть связка парент-чайлд в свете новых достижений семантики?  Парент владеет чайлдами? Да, стало быть все равно парент должен иметь контейнер чайлдов. Или (теперь уже) вумных указателей. Да, но "юники" копировать нельзя, а контейнер потребует. Слышал как-то это обходится "муванием". И как тогда удалять тот же виджет (чайлд)?

Да уж наворотили в Qt всего Подмигивающий.
Ах как мы добродушны и снисходительны  Улыбающийся
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #47 : Декабрь 11, 2023, 16:24 »

Проблема владения не редкий вопрос на форуме), например, Про деревянный айтем )). Паттерн parent-child, как раз про отношение часть-целое, отношение владения.

В архитектуре QObject владение child, вроде как, передается parent, а вроде как и нет. Никто не мешает удалить child напрямую, минуя parent. Такое вот двойное управление ресурсами.

Как следствие вопросы типа должен ли я озаботится о зачистке памяти?, так как интуитивно не понятно, в каком случае Qt почистит ресурсы, а в каком нет. Постоянно нужно в доки глядеть).
Но я уверен, что >90% разработчиков этот вопрос никак не волнует и интерпретируется даже, как удобство).

Цитировать
Слышал как-то это обходится "муванием". И как тогда удалять тот же виджет (чайлд)?

Можно и с move и без него. Удалять виджет следовало бы либо с помощью API владельца (parent), либо сначала извлечь child из parent, а затем удалять.
Здесь расписан пример реализации иерархии tree-example. Отношение parent-child реализована для класса Node.
« Последнее редактирование: Декабрь 11, 2023, 16:31 от ssoft » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #48 : Декабрь 11, 2023, 17:39 »

Эх, какие были срачи... Ушла эпоха. Улыбающийся

Но хорошо что Igors нашелся (а то я даже беспокоиться начал - не сарказм), значит еще пообсуждаем. Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #49 : Декабрь 11, 2023, 23:33 »

Но хорошо что Igors нашелся (а то я даже беспокоиться начал - не сарказм), значит еще пообсуждаем. Улыбающийся
ABBAPOH тоже очень беспокоился, что больше нет животрепещущих тем Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #50 : Декабрь 12, 2023, 21:38 »

Чтоб был срач - нужно, чтобы был заинтересованный народ. Современный народ, по бОльшей части, в винде чалится. А что можно обсуждать на подоконнике?  Смеющийся
Записан

andron81_81
Новичок

Offline Offline

Сообщений: 6


Просмотр профиля
« Ответ #51 : Декабрь 14, 2023, 12:47 »

срач был в sql.ru вот там срач так срач был.
Записан
Страниц: 1 2 3 [4]   Вверх
  Печать  
 
Перейти в:  


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