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クリーンアップされますか? ユーザーが終了せずにこの関数を 1000 回呼び出した場合、メモリ リークが発生しますか?

アップデート

上記の関数が頻繁に何度も呼び出されることを考えるとQProcess、メンバー変数を宣言する方が良いQSharedPointerですか、それとも上記のコードを改善するために使用するだけですか?

4

2 に答える 2

2

Qt は「所有権」ツリー構造を処理します。QObject には一連の子がある場合があり、それが削除されると、すべての子が削除されます。

コードでは、渡した が削除さsyncProcessれたとき、thisまたは明示的に削除されたときに が削除されます。

finishedシグナルを独自のdeleteLaterスロットに接続することにより、シグナルを送信した後にそれ自体を削除することができます。

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