Qt应用程序有自动垃圾收集吗?

Does Qt applications have automatic garbage collection?

本文关键字:应用程序 Qt      更新时间:2023-10-16

我正在研究这个问题,但我没有看到一个结论性的答案。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来改进上面的代码更好?

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

在你的例子中,当你的MainWindow类被销毁时,QProcesses也会被销毁。

edit: https://stackoverflow.com/a/19332239/841330 RobbieE的回答真的很好

Qt句柄"所有权"树状结构。一个QObject可能有一组子对象,如果它被删除,那么它将删除它所有的子对象。

在你的代码中,当你传递的this被删除或当它显式地被删除时,syncProcess将被删除。

你可以让它在发送信号后将finished信号连接到自己的deleteLater插槽。:

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