7

我正在研究这个,但我没有看到一个确凿的答案。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改进上面的代码?

4

2 回答 2

10

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

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

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

于 2015-08-27T15:11:04.177 回答
2

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

在您的代码中,syncProcessthis您传递的 被删除或显式删除时,将被删除。

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

connect(syncProcess, SIGNAL(finished(int)), syncProcess, SLOT(deleteLater()) );
于 2015-08-27T15:16:55.697 回答