Qt 应用程序是否具有自动垃圾收集功能?
Does Qt applications have automatic garbage collection?
我正在研究这个,但我没有看到一个决定性的答案。 Qt 小部件应用程序在退出时会清理内存吗?从 QObject 派生有什么区别吗?如果有垃圾回收,为什么会有 QSharedPointer
class?我从我的代码的以下上下文中询问。
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 不使用垃圾收集,而是使用引用计数(在 QSharedPointers 的情况下)和对象所有权(在您的示例的情况下)。
在您的情况下,当您的 MainWindow class 被销毁时,QProcesses 将被销毁。
编辑: RobbieE 的回答非常好。
Qt 处理 "ownership" 树结构。一个 QObject 可能有一组 children 并且如果它被删除那么它将删除它的所有 children.
在您的代码中,当您传递的 this
被删除或明确被删除时,syncProcess
将被删除。
您可以通过将 finished
信号连接到它自己的 deleteLater
插槽,让它在发送信号后自行删除。:
connect(syncProcess, SIGNAL(finished(int)), syncProcess, SLOT(deleteLater()) );
我正在研究这个,但我没有看到一个决定性的答案。 Qt 小部件应用程序在退出时会清理内存吗?从 QObject 派生有什么区别吗?如果有垃圾回收,为什么会有 QSharedPointer
class?我从我的代码的以下上下文中询问。
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 不使用垃圾收集,而是使用引用计数(在 QSharedPointers 的情况下)和对象所有权(在您的示例的情况下)。
在您的情况下,当您的 MainWindow class 被销毁时,QProcesses 将被销毁。
编辑: RobbieE 的回答非常好。
Qt 处理 "ownership" 树结构。一个 QObject 可能有一组 children 并且如果它被删除那么它将删除它的所有 children.
在您的代码中,当您传递的 this
被删除或明确被删除时,syncProcess
将被删除。
您可以通过将 finished
信号连接到它自己的 deleteLater
插槽,让它在发送信号后自行删除。:
connect(syncProcess, SIGNAL(finished(int)), syncProcess, SLOT(deleteLater()) );