【问题标题】:How to release memory of Qthread object?如何释放 Qthread 对象的内存?
【发布时间】:2014-12-30 02:58:37
【问题描述】:

我做过这样的事情:

//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 并在主窗口的解构器中工作吗?

【问题讨论】:

    标签: c++ qt qthread


    【解决方案1】:

    您可以通过将父级分配给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

    【讨论】:

    【解决方案2】:

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

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

    释放由QThread 处理的线程内获取的资源必须单独处理,因为您不能使QThread 对象成为它管理的资源的父对象 - QThread 存在于创建它的线程中而不是在它管理的线程中。

    更多详情here.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 2010-10-30
      • 2019-10-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      相关资源
      最近更新 更多