Сообщение Re: Про QObject::deleteLater() от 10.10.2025 9:34
Изменено 10.10.2025 9:37 SaZ
Re: Про QObject::deleteLater()
Здравствуйте, m2user, Вы писали:
M>Собственно вопрос, в каких случаях следует применять deleteLater(), а в каких применим delete.
M>А также что делать с объектами, созданными на стеке — когда их можно использовать в слотах/сигналах.
M>...
Там уже почти на все вопросы ответили. Добавлю про объекты на стеке. Если вы объекту на стеке сделаете setParent и удалите его нового родителя, то будет как минимум двойной вызов деструктора со всеми вытекающими последствиями. А так, в целом, всё будет ок.
И если в слоте вы дёрнете sender() для объекта который помечен через deleteLater или находится в состоянии удаления, то qobject_cast<ВашТип> вернёт nullptr. Мне как-то раз понадобилось определять, удаляется ли сейчас объект или нет и я нашёл такой вот способ.
Ещё один неочевидный нюанс — это принадлежность к потокам. Если у вас объекты в общей иерархии памяти (родитель-ребёнок), то они всегда будут принадлежать одному потоку. И поменять принадлежность для всей иерахии можно только через корневой элемент. И да, делать moveToThread для объекта на стеке — тоже большой риск выстрелить себе в ногу. Надо очень хорошо будет следить за временем жизни объектов.
M>Собственно вопрос, в каких случаях следует применять deleteLater(), а в каких применим delete.
M>А также что делать с объектами, созданными на стеке — когда их можно использовать в слотах/сигналах.
M>...
Там уже почти на все вопросы ответили. Добавлю про объекты на стеке. Если вы объекту на стеке сделаете setParent и удалите его нового родителя, то будет как минимум двойной вызов деструктора со всеми вытекающими последствиями. А так, в целом, всё будет ок.
И если в слоте вы дёрнете sender() для объекта который помечен через deleteLater или находится в состоянии удаления, то qobject_cast<ВашТип> вернёт nullptr. Мне как-то раз понадобилось определять, удаляется ли сейчас объект или нет и я нашёл такой вот способ.
Ещё один неочевидный нюанс — это принадлежность к потокам. Если у вас объекты в общей иерархии памяти (родитель-ребёнок), то они всегда будут принадлежать одному потоку. И поменять принадлежность для всей иерахии можно только через корневой элемент. И да, делать moveToThread для объекта на стеке — тоже большой риск выстрелить себе в ногу. Надо очень хорошо будет следить за временем жизни объектов.
Re: Про QObject::deleteLater()
Здравствуйте, m2user, Вы писали:
M>Собственно вопрос, в каких случаях следует применять deleteLater(), а в каких применим delete.
M>А также что делать с объектами, созданными на стеке — когда их можно использовать в слотах/сигналах.
M>...
Там уже почти на все вопросы ответили. Добавлю про объекты на стеке. Если вы объекту на стеке сделаете setParent и удалите его нового родителя, то будет как минимум двойной вызов деструктора со всеми вытекающими последствиями. А так, в целом, всё будет ок.
И если в слоте вы дёрнете sender() для объекта который помечен через deleteLater или находится в состоянии удаления, то qobject_cast<ВашТип> вернёт nullptr. Мне как-то раз понадобилось определять, удаляется ли сейчас объект или нет и я нашёл такой вот способ.
Ещё один неочевидный нюанс — это принадлежность к потокам. Если у вас объекты в общей иерархии памяти (родитель-ребёнок), то они всегда будут принадлежать одному потоку. И поменять принадлежность для всей иерахии можно только через корневой элемент. И да, делать moveToThread для объекта на стеке — тоже большой риск выстрелить себе в ногу. Надо очень хорошо будет следить за временем жизни объектов.
P.S. вспомнил что раньше в Qt был баг/фича при работе с некоторыми наследниками всяких qiodevice, например сокетами. Для таких объектов moveToThread отрабатывал лишь частично и возникали разные трудноотлаживаемые проблемы. То есть нужно такие объекты создавать сразу в том потоке где вы хотите ловить сигналы.
M>Собственно вопрос, в каких случаях следует применять deleteLater(), а в каких применим delete.
M>А также что делать с объектами, созданными на стеке — когда их можно использовать в слотах/сигналах.
M>...
Там уже почти на все вопросы ответили. Добавлю про объекты на стеке. Если вы объекту на стеке сделаете setParent и удалите его нового родителя, то будет как минимум двойной вызов деструктора со всеми вытекающими последствиями. А так, в целом, всё будет ок.
И если в слоте вы дёрнете sender() для объекта который помечен через deleteLater или находится в состоянии удаления, то qobject_cast<ВашТип> вернёт nullptr. Мне как-то раз понадобилось определять, удаляется ли сейчас объект или нет и я нашёл такой вот способ.
Ещё один неочевидный нюанс — это принадлежность к потокам. Если у вас объекты в общей иерархии памяти (родитель-ребёнок), то они всегда будут принадлежать одному потоку. И поменять принадлежность для всей иерахии можно только через корневой элемент. И да, делать moveToThread для объекта на стеке — тоже большой риск выстрелить себе в ногу. Надо очень хорошо будет следить за временем жизни объектов.
P.S. вспомнил что раньше в Qt был баг/фича при работе с некоторыми наследниками всяких qiodevice, например сокетами. Для таких объектов moveToThread отрабатывал лишь частично и возникали разные трудноотлаживаемые проблемы. То есть нужно такие объекты создавать сразу в том потоке где вы хотите ловить сигналы.