C++ 通过将finished()信号连接到QObject::deleteLater()来解除分配位于刚刚结束的线程中的对象

C++ 通过将finished()信号连接到QObject::deleteLater()来解除分配位于刚刚结束的线程中的对象,c++,multithreading,qt,qthread,C++,Multithreading,Qt,Qthread,发件人: 从Qt4.8开始,通过将finished()信号连接到QObject::deleteLater(),可以释放位于刚刚结束的线程中的对象 这是否意味着,如果我将finished()信号连接到QObject::deleteLater(),我就不必担心工作线程中的内存泄漏 它将自己释放工作线程类的哪些对象 connect(workerThread,&workerThread::finished,workerThread,&QObject::deleteLater) 发件人:doc.qt.io

发件人:

从Qt4.8开始,通过将finished()信号连接到QObject::deleteLater(),可以释放位于刚刚结束的线程中的对象

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

它将自己释放工作线程类的哪些对象

connect(workerThread,&workerThread::finished,workerThread,&QObject::deleteLater)
发件人:doc.qt.io/qt-5/qthread.html#详细信息

它们显示了连接到deleteLater插槽的workerthread对象。现在,这是否意味着我在worker类中分配内存的所有对象都将被自动删除

它将自行释放哪些对象

已连接其
deleteLater
插槽的对象

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

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

它将自行释放哪些对象

已连接其
deleteLater
插槽的对象

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


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

如果
QThread
结束(当它
run()
方法返回时),它会发送信号
QThread::finished
。 其
deleteLater
插槽连接到此信号的每个
QObject
都将被删除

如果将
QThread::finished()
信号连接到
QThread
()文档中提到的worker对象的
QObject::deleteLater()
方法,则在
QThread
完成后将删除该worker。 您在worker中创建的所有其他
QoObject
仍将存在。
如果您也希望删除它们,则必须将它们连接到同一个QThread::finished()信号,或者通过将worker对象设置为另一个对象的父对象来使用父子机制(通过在构造函数中将其作为父对象传递(),或者通过使用
void QObject::setParent(QObject*parent)
().

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

如果将
QThread::finished()
信号连接到
QThread
()文档中提到的worker对象的
QObject::deleteLater()
方法,则在
QThread
完成后将删除该worker。 您在worker中创建的所有其他
QoObject
仍将存在。
如果您也希望删除它们,则必须将它们连接到同一个QThread::finished()信号,或者通过将worker对象设置为另一个对象的父对象来使用父子机制(通过在构造函数中将其作为父对象传递(),或者通过使用
void QObject::setParent(QObject*parent)
().

一点也不。您正在将
workerThread
finished()
信号连接到它自己的
deleteLater()
。这不是文档的意思(因为在未动态分配
workerThread
时,这将导致未定义的行为)。相反,您需要连接
finished()
向辅助对象的
deleteLater()
发送信号。辅助对象应该位于辅助线程中(通过使用
moveToThread(workerThread)
)…@Mike请展示这个例子。我在那里写的东西写在文档中。引用确实来自文档,但这并不意味着你应该将线程的
finished()
信号连接到它自己的
deleteLater()
。通常,你将
finished()
信号连接到另一个worker QObject的
deleteLater())
,这样当线程完成时,辅助对象就会被销毁。我现在没有时间提供完整的示例,但我稍后会尝试发布一个…这是否意味着主线程的完成信号应该连接到辅助对象的deleteLater?@MikeExactly。通常,您不需要为QThread子类。相反,让辅助对象QObjectt承载需要在工作线程中执行的代码,然后将该工作对象移动到线程,并在将已完成的信号从线程连接到工作线程的deleteLater后启动它……一点也不。您正在将
workerThread
finished()
信号连接到它自己的
deleteLater()
。这不是文档的意思