Qt应用程序有自动垃圾收集吗?
Does Qt applications have automatic garbage collection?
我正在研究这个问题,但我没有看到一个结论性的答案。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
来改进上面的代码更好?
Qt不使用垃圾收集,而是使用引用计数(在qsharedpointer的情况下)和对象所有权(在您的示例的情况下)。
在你的例子中,当你的MainWindow类被销毁时,QProcesses也会被销毁。
edit: https://stackoverflow.com/a/19332239/841330 RobbieE的回答真的很好
Qt句柄"所有权"树状结构。一个QObject可能有一组子对象,如果它被删除,那么它将删除它所有的子对象。
在你的代码中,当你传递的this
被删除或当它显式地被删除时,syncProcess
将被删除。
你可以让它在发送信号后将finished
信号连接到自己的deleteLater
插槽。:
connect(syncProcess, SIGNAL(finished(int)), syncProcess, SLOT(deleteLater()) );
相关文章:
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在qt中同步应用程序和显示器的刷新率?
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- Qt QML桌面应用程序自动化测试
- Qt creator 4.11,在应用程序输出面板中创建一个链接
- 使用 Bazel 编译 QT 应用程序时访问资源
- 将 Crashpad 与 Windows Qt 应用程序集成
- 在Visual Studio中单实例Qt应用程序版本5.11.1中,在所有其他窗口的顶部打开Qt MainWindow
- 在 Ubuntu 服务器上运行 QT 应用程序时崩溃
- 如何在Android设备上解析Qt应用程序的ClassNotFoundEception?
- Qt应用程序找不到第三方DLL并崩溃
- 在 Linux 上部署 Qt 应用程序
- 为什么Qt Creator的应用程序输出不能从spdlog记录器打印
- QT 样式表主题,适用于使用属性选择器的整个应用程序
- 构建一个真正、完全静态的Qt 5框架和应用程序(Qt 5.8之后)
- 无法从对话框中关闭应用程序(Qt 应用程序)
- 将Poco C++库包含到Mac OS X上的Qt Quick应用程序(Qt Creator)中
- 独立应用程序Qt
- 打开文件时基于 Qt 的应用程序'Qt platform plugin windows not found'问题
- 我的应用程序"Qt"在我的计算机中运行,但在我朋友的计算机上无法运行