来自:http://doc.qt.io/qt-5/qthread.html#details
从Qt 4.8开始,通过将finished()信号连接到QObject :: deleteLater(),可以释放生活在刚刚结束的线程中的对象。
这是否意味着如果我将finished()信号连接到QObject :: deleteLater()我不必担心工作线程中的内存泄漏?
工作线程类的哪些对象将自行解除分配?
connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
来自:doc.qt.io/qt-5/qthread.html#details
他们已经将workerthread的对象显示为连接到deleteLater插槽。现在这是否意味着我在工人类内部分配内存的所有对象都会自动删除?
答案 0 :(得分:2)
如果QThread
结束(当run()
方法返回时),则会发送信号QThread::finished
。
<{1}}插槽连接到此信号的每个QObject
都会被删除。
如果您按照deleteLater
(http://doc.qt.io/qt-5/qthread.html#details)文档中的说明将QThread::finished()
信号连接到工作对象的QObject::deleteLater()
方法,那么工作符将在QThread
已完成。
您在工作程序中创建的所有其他QThread
仍将存在。
如果你想要删除它们,你必须将它们连接到相同的QThread :: finished()信号,或者通过将worker对象设置为另一个对象的父对象来使用父子机制(通过将其作为构造函数中的父级(http://doc.qt.io/qt-5/qobject.html#QObject)或使用QObjects
(http://doc.qt.io/qt-5/qobject.html#setParent)明确设置。
答案 1 :(得分:1)
它会自行取消分配哪些对象?
您连接deleteLater
广告位的对象。
但是你有它倒退,似乎:线程和对象生命周期是正交问题。只是因为东西在其他一些线程中运行并不意味着它会以某种方式泄漏 - 除非你完全放弃了对象的生命周期管理。
想象一下,你的对象存在于主线程中。你将如何管理他们的一生?在工人身上做同样的事情。它也没有必要结束工作线程中的对象生存期。您可以将它们推回到主线程,结束工作线程,并在主线程中销毁它们。等等。线程在这里没有引入任何新问题:你从一开始就遇到了问题。解决它,然后添加线程,它不会再出现:)