如何释放Qthread对象的内存?

时间:2014-11-03 12:35:43

标签: c++ qt qthread

我做过这样的事情:

//in the mainwindow's constructor
QThread *thr = new QThread;
soundWorker * work = new soundWorker;
connect(this,SIGNAL(playsound()),work,SLOT(process()));
work->moveToThread(thr);
thr->start();

我应该删除thr并在mainwindow的解构器中工作吗?

2 个答案:

答案 0 :(得分:5)

您可以通过将父级分配给QThread来使用默认的Qt管理内存方式,即执行此操作:

QThread *thr = new QThread(this);//the mainwindow's is now the thread parent

在Qt,父母负责管理孩子的记忆。因此,QThread将在需要时自动删除。

然后,对于您的soundWorker,您有几种不同的解决方案。如果它的生命周期与您的mainwindow相同,当您询问是否应该在mainwindow的析构函数中删除它时,您可以简单地将其设为非指针成员,并将其存储然后会自动处理持续时间。

父母的东西特定于Qt。通常,当您自己处理内存时,应该使用启用RAII的包装器(例如智能指针)。

进一步阅读:Qt Trees and ownership model

答案 1 :(得分:2)

您可以使用QThread::finished()信号来检测您希望释放QThread指针的那一刻。使用移动到新线程的QObject指针也可以完成同样的事情。

考虑到关闭主窗口的时刻是关闭整个应用程序的时刻,并且考虑到在应用程序关闭后您不需要进一步处理,您可以将主窗口指针作为父窗口传递通过将QThread传递给构造函数或使用QObject::setParent来获取QThread

释放QThread处理的线程内部获取的资源必须单独处理,因为您无法使QThread对象成为由其管理的资源的父级 - {{1}}生活在创建它的线程中,而不是它管理的线程中。

更多详情here