Qt应用程序是否有自动垃圾回收?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt应用程序是否有自动垃圾回收?相关的知识,希望对你有一定的参考价值。

我正在研究这个,但我没有看到一个确凿的答案。 Qt小部件应用程序在退出时是否会清理内存?它是否与QObject有任何区别?如果有垃圾收集,为什么有QSharedPointer类?我从我的代码的以下上下文中询问。

void MainWindow::sync()
{
    QString destPathUnixStyle = makePathUnix( _RootPath );

    QString rsync_cmd = QString("rsync/rsync -a root@%1:/data/ '%2'").arg( _ip ).arg( destPathUnixStyle );

    QProcess *syncProcess = new QProcess(this);
    syncProcess->start( rsync_cmd );

    qDebug() << "Sync started..";

    connect(syncProcess, SIGNAL(finished(int)), this, SLOT(syncFinished()) );

    _syncInProgress = true;
}

现在,当应用程序退出时,我的syncProcess会被清除吗?如果用户在没有退出的情况下调用此函数一千次,会产生内存泄漏吗?

更新

鉴于上面的函数经常被调用很多次,是否更好地将QProcess声明为成员变量或者只是使用QSharedPointerto来改进上面的代码?

答案

QT不使用垃圾收集,而是使用引用计数(在QSharedPointers的情况下)和对象所有权(在您的示例的情况下)。

在您的情况下,当您的MainWindow类被销毁时,QProcesses将被销毁。

编辑:https://stackoverflow.com/a/19332239/841330 RobbieE的回答非常好。

另一答案

Qt处理“所有权”树结构。 QObject可能有一组子项,如果它被删除,那么它将删除它的所有子项。

在您的代码中,当您传递的syncProcess被删除或明确删除时,this将被删除。

您可以通过将finished信号连接到自己的deleteLater插槽发送信号后让它自行删除:

connect(syncProcess, SIGNAL(finished(int)), syncProcess, SLOT(deleteLater()) );

以上是关于Qt应用程序是否有自动垃圾回收?的主要内容,如果未能解决你的问题,请参考以下文章

GC垃圾回收机制

GC垃圾回收机制

Java开发中啥是垃圾回收?

Java 垃圾回收 - 收集算法

Java的内存回收机制详解

垃圾回收简介