Есть объект класса QNetworkReply. Есть слот (в каком-то другом объекте), связанный с его сигналом finished (). Сигналы синхронные (по умолчанию). Есть только одна ветка.
В какой-то момент я хочу избавиться от обоих предметов. Больше никаких сигналов или чего-либо от них. Я хочу, чтобы они ушли. Ну подумал я воспользуюсь
delete obj1; delete obj2;
Но могу ли я на самом деле? Спецификации для ~ QObject говорят:
Удаление QObject во время ожидания доставки ожидающих событий может вызвать сбой.
Что такое «ожидающие события»? Может ли это означать, что пока я звоню своему delete
, уже есть некоторые «ожидающие события», которые нужно доставить, и что они могут вызвать сбой, и я не могу проверить, есть ли они?
Допустим, я звоню:
obj1->deleteLater(); obj2->deleteLater();
Чтобы быть в безопасности.
Но действительно ли я в безопасности? deleteLater
добавляет событие, которое будет обработано в основном цикле, когда туда попадет управление. Могут ли уже быть какие-то ожидающие события (сигналы) для obj1
или obj2
, ожидающие обработки в основном цикле до обработки deleteLater? Это было бы очень прискорбно. Я не хочу писать код, проверяющий статус «несколько удален» и игнорирующий входящий сигнал во всех моих слотах.
obj->disconnect(); obj->deleteLater();
- правильный путь: - person stach   schedule 16.03.2011deleteLater()
просто отправляетQDeferredDeleteEvent
объекту, для которого был вызванdeleteLater()
. Когда это событие получено QObject, его обработчик событий в конечном итоге вызовет обычныйdelete
, который, в свою очередь, вызовет деструктор QObject. Отключение сигнала не происходит до конца деструктора, поэтому я предполагаю, что QObject будет запускать слоты, которые вызываются сигналами DirectConnection, которые излучаются после вызоваdeleteLater()
, но до того, как цикл событий вернется. - person Kasheen   schedule 04.04.2018