2015-06-04 5 views
3

Qt ссылки на QObject деструкторе говорят:Неоднозначный деструктор для QObject?

Всех сигналов и от объекта, автоматически отключается, и любые ожидающие Отправленные событий для объекта удаляется из очереди событий. Однако, более безопасно использовать deleteLater() вместо того, чтобы напрямую удалять подкласс QObject.

...

Предупреждение: Удаление QObject в то время как в ожидании событий, ожидающих быть доставлены может привести к аварии. Вы не должны удалять QObject напрямую, если он существует в другом потоке, чем тот, который выполняется в настоящий момент. Вместо этого используйте deleteLater(), из-за чего цикл цикла будет удалять объект после отправки всех ожидающих событий.

Обратите внимание на жирные строки в приведенном выше разделе.

Итак, вопрос в том, удалены ли ожидающие отправленные события из очереди событий или нет?

ответ

4

Предупреждение: Удаление QObject в ожидании ожидающих событий может привести к сбою. Вы не должны удалять QObject напрямую , если он существует в другом потоке, чем тот, который в настоящее время выполняется.

Вы сосредотачиваетесь на первом утверждении этого предложения и игнорируете второе. Эта ситуация касается удаления объекта, который существует в другом потоке - (разные thread affinity).

Если, например, вы работаете на основном (GUI) потоке и имеете объект во втором потоке, удаление другого объекта из основного потока может привести к сбою.

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

Давайте подумаем о том, что происходит.

Когда объект вызывает сигнал, если получатель объекта находится в том же потоке, что и вызываемый, функция вызывается немедленно (при условии, что connection type является автоматическим или прямым).

Если приемник объекта имеет различную аффинность резьбы, автоматическое соединение приводит к соединению в очереди; вместо прямого вызова функции, событие отправляется в очередь событий потока для принимающего объекта.

Когда дело доходит до удаления объекта, если мы вызываем удаление из другого потока, он не может получить доступ к очереди событий другого потока для удаления ожидающих событий. Что еще более важно, он не является потокобезопасным и может привести к сбою.

+0

Спасибо, @TheDarkKnight. Давайте немного перефразируем вопрос: если QObject существует только в одном потоке, тогда безопасно вызывать delete столько же, сколько безопасно для вызова deleteLater? – agnor

+2

Это зависит от того, в какой точке кода вы удаляете объект. Если код находится в функции слота, тогда [вы должны позвонить deleteLater] (http://stackoverflow.com/questions/22376298/when-to-use-deletelater/22378104#22378104) – TheDarkKnight

 Смежные вопросы

  • Нет связанных вопросов^_^