Re: Про QObject::deleteLater()
От: SaZ  
Дата: 10.10.25 09:34
Оценка: 2 (1)
Здравствуйте, m2user, Вы писали:

M>Собственно вопрос, в каких случаях следует применять deleteLater(), а в каких применим delete.

M>А также что делать с объектами, созданными на стеке — когда их можно использовать в слотах/сигналах.

M>...


Там уже почти на все вопросы ответили. Добавлю про объекты на стеке. Если вы объекту на стеке сделаете setParent и удалите его нового родителя, то будет как минимум двойной вызов деструктора со всеми вытекающими последствиями. А так, в целом, всё будет ок.

И если в слоте вы дёрнете sender() для объекта который помечен через deleteLater или находится в состоянии удаления, то qobject_cast<ВашТип> вернёт nullptr. Мне как-то раз понадобилось определять, удаляется ли сейчас объект или нет и я нашёл такой вот способ.

Ещё один неочевидный нюанс — это принадлежность к потокам. Если у вас объекты в общей иерархии памяти (родитель-ребёнок), то они всегда будут принадлежать одному потоку. И поменять принадлежность для всей иерахии можно только через корневой элемент. И да, делать moveToThread для объекта на стеке — тоже большой риск выстрелить себе в ногу. Надо очень хорошо будет следить за временем жизни объектов.

P.S. вспомнил что раньше в Qt был баг/фича при работе с некоторыми наследниками всяких qiodevice, например сокетами. Для таких объектов moveToThread отрабатывал лишь частично и возникали разные трудноотлаживаемые проблемы. То есть нужно такие объекты создавать сразу в том потоке где вы хотите ловить сигналы.
Отредактировано 10.10.2025 9:37 SaZ . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.