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

Does Qt applications have automatic garbage collection?

我正在研究这个,但我没有看到一个决定性的答案。 Qt 小部件应用程序在退出时会清理内存吗?从 QObject 派生有什么区别吗?如果有垃圾回收,为什么会有 QSharedPointer class?我从我的代码的以下上下文中询问。

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 来改进上面的代码?

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

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

编辑: RobbieE 的回答非常好。

Qt 处理 "ownership" 树结构。一个 QObject 可能有一组 children 并且如果它被删除那么它将删除它的所有 children.

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

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

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