Qt应用程序是否有自动垃圾回收?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
to来改进上面的代码?
答案
QT不使用垃圾收集,而是使用引用计数(在QSharedPointers的情况下)和对象所有权(在您的示例的情况下)。
在您的情况下,当您的MainWindow类被销毁时,QProcesses将被销毁。
编辑:https://stackoverflow.com/a/19332239/841330 RobbieE的回答非常好。
另一答案
Qt处理“所有权”树结构。 QObject可能有一组子项,如果它被删除,那么它将删除它的所有子项。
在您的代码中,当您传递的syncProcess
被删除或明确删除时,this
将被删除。
您可以通过将finished
信号连接到自己的deleteLater
插槽发送信号后让它自行删除:
connect(syncProcess, SIGNAL(finished(int)), syncProcess, SLOT(deleteLater()) );
以上是关于Qt应用程序是否有自动垃圾回收?的主要内容,如果未能解决你的问题,请参考以下文章