Qt应用程序是否具有自动垃圾收集功能?

时间:2015-08-27 14:58:02

标签: c++ qt memory-leaks garbage-collection qsharedpointer

我正在研究这个,但我没有看到确凿的答案。 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成员变量或仅使用QSharedPointer来改进上面的代码吗?

2 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:1)

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

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

您可以通过将finished信号连接到自己的deleteLater广告位来发送信号后让它自行删除。:

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