通过将 finished() 信号连接到 QObject::deleteLater() 来释放位于刚刚结束的线程中的对象

deallocate objects that live in a thread that has just ended, by connecting the finished() signal to QObject::deleteLater()

发件人:http://doc.qt.io/qt-5/qthread.html#details

From Qt 4.8 onwards, it is possible to deallocate objects that live in a thread that has just ended, by connecting the finished() signal to QObject::deleteLater().

这是否意味着如果我将 finished() 信号连接到 QObject::deleteLater(),我就不必担心工作线程中的内存泄漏?

工作线程 class 的哪些对象将自行释放?

connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater); 来自:doc.qt.io/qt-5/qthread.html#details

他们已经显示连接到 deleteLater 插槽的工作线程的对象。现在这是否意味着我在 worker class 中分配内存的所有对象都将被自动删除?

What objects is it going to deallocate on its own?

您连接的 deleteLater 个插槽的对象。

但你似乎倒过来了:线程和对象生命周期是正交的问题。仅仅因为东西在其他线程中运行并不意味着它会以某种方式泄漏 - 除非您完全放弃对象生命周期管理。

假设您的对象位于主线程中。你将如何管理他们的一生?在工人中做同样的事情。也没有必要在工作线程中结束对象生命周期。你可以把它们推回主线程,结束工作线程,在主线程中销毁它们。等等。线程在这里没有引入任何新问题:您从一开始就遇到了问题。解决了,然后加线程就不会再出现了:)

如果 QThread 结束(当它 run() 方法 returns 时)它发送信号 QThread::finished。 每个 QObjectdeleteLater 插槽连接到此信号的都将被删除。

如果您将 QThread::finished() 信号连接到 QThread (http://doc.qt.io/qt-5/qthread.html#details) 文档中提到的 worker 对象的 QObject::deleteLater() 方法,则该 worker 将被删除QThread 完成后。 您在工作人员中创建的所有其他 QObjects 将仍然存在。 如果您也希望删除它们,则必须将它们连接到相同的 QThread::finished() 信号,或者通过将工作对象设置为另一个对象的父对象来使用父子机制(通过传递它作为构造函数中的父级 (http://doc.qt.io/qt-5/qobject.html#QObject) or by setting it explicitly with void QObject::setParent(QObject *parent) (http://doc.qt.io/qt-5/qobject.html#setParent).