Есть ли в приложениях Qt автоматическая сборка мусора?

Я изучаю это, но я не вижу окончательного ответа. Очищает ли приложение виджета 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 для улучшения кода выше?


person zar    schedule 27.08.2015    source источник
comment
В Qt нет сборки мусора. Есть понятие собственности. С помощью new QProcess(this); вы создали новый объект QProcess, принадлежащий this экземпляру MainWindow. Когда QObject уничтожается, он, в свою очередь, уничтожает все принадлежащие ему объекты.   -  person Igor Tandetnik    schedule 27.08.2015
comment
@IgorTandetnik, поскольку моя функция вызывается неоднократно, будет ли она собирать память во время одного запуска выполнения? Должен ли я вместо этого использовать QSharedPointer или сделать QProcess переменной-членом?   -  person zar    schedule 27.08.2015
comment
Я полагаю, вы могли бы явно уничтожить его в обработчике finished. QObject::deleteLater удобен для этого (это позволяет избежать удаления объекта, находящегося в сигнале этого объекта).   -  person Igor Tandetnik    schedule 27.08.2015


Ответы (2)


QT не использует сборку мусора, вместо этого он использует подсчет ссылок (в случае QSharedPointers) и владение объектом (в случае вашего примера).

В вашем случае QProcesses будут уничтожены, когда ваш класс MainWindow будет уничтожен.

edit: https://stackoverflow.com/a/19332239/841330 Ответ RobbieE действительно хорош.

person Chase Henslee    schedule 27.08.2015

Qt обрабатывает древовидную структуру «владения». QObject может иметь набор дочерних элементов, и если он будет удален, он удалит все свои дочерние элементы.

В вашем коде syncProcess будет удалено, когда this, которое вы передали, будет удалено или когда оно будет удалено явно.

Вы можете позволить ему удалить себя после отправки сигнала, подключив сигнал finished к его собственному слоту deleteLater:

connect(syncProcess, SIGNAL(finished(int)), syncProcess, SLOT(deleteLater()) );
person ratchet freak    schedule 27.08.2015