我在QThread::finished
:的Qt 5.15文档中读到了这一点
发出此信号时,事件循环已停止运行。线程中将不再处理任何事件,但延迟删除事件除外。该信号可以连接到
QObject::deleteLater()
,以释放该线程中的对象。
然而,在文档的另一部分中,它说
从拥有对象的线程之外的线程调用QObject上的
delete
(或以其他方式访问对象(是不安全的,除非您保证该对象当时没有处理事件[emphasis mine]。
如果我正确理解这一点,在发出QThread::finished
之后,事件循环已经停止运行,如果不存在延迟删除事件(即QObject::deleteLater
没有被调用(,线程中的所有对象也应该已经完成了对事件的处理。那么,为什么要为这些对象使用QObject::deleteLater
,而不是手动删除它们呢?我使用QObject::deleteLater
没有问题;我只是确保我对Qt的理解是正确的。
QObject::deleteLater
在这种情况下本质上只是谨慎行事。如果你绝对确定对象不可能被访问,那么你没有理由不简单地delete
对象。
然而,在实践中,与在运行时或退出时调试一些看似随机的崩溃(因为碰巧有人访问您手动删除的对象(相比,只需使用QObject::deleteLater
并让Qt为您处理它,您将节省更多的时间。