Q系统关闭时未销毁的子对象
QApplication child objects not destroyed when the system is shut down
我有一个带有单个对话框窗口的Qt应用程序。主要看起来像这样:
QApplication a(argc, argv);
MyObject * myMobject = new QObject(&a);
MainWindow w;
w.show();
return a.exec();
MyObject
构造函数创建一个临时文件,析构函数将其删除。
当我通过关闭对话框正常关闭应用程序时,MyObject
析构函数按预期调用,因为它是QApplication
的子级,在main()
中分配给堆栈。
但是,当用户会话关闭(注销、关机等)时,不会删除该文件,这表明永远不会调用MyObject
析构函数。
这是什么原因呢?我虽然 Windows 在会话关闭之前关闭了每个窗口,但看起来我的进程已终止。
从文档中可以看出QCoreApplication::aboutToQuit()
信号。但本文档告诉Qt检测到关机并退出事件循环,在最后发出该信号。
如果真的是这样,a.exec()
应该返回,就像窗口关闭时一样,QApplication
应该与其子项一起销毁,调用MyObject
析构函数。换句话说,由于myObject
是a
的子代,因此不需要处理aboutToQuit()
信号。
直接来自QApplication的文档:
我们建议您将清理代码连接到 aboutToQuit() 信号,而不是将其放在应用程序的 main() 函数中。这是因为,在某些平台上,QApplication::exec() 调用可能不会返回。例如,在Windows平台上,当用户注销时,系统会在Qt关闭所有顶级窗口后终止进程。因此,不能保证应用程序有时间退出其事件循环并在 main() 函数的末尾执行代码,在 QApplication::exec() 调用之后。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用带有C++对象和标准库容器的插件系统
- 如果在创建对象时创建了 VPTR,那么为什么具有虚拟功能的类的大小在 32 位系统上为 4,在 64 位机器上为 8
- 在C++中,系统如何将这些对象中的每一个与执行程序的窗口相关联?
- 系统C 从字符串对象sc_uint
- 错误 C2440:无法将"系统::D rawing::位图"转换为"系统::对象"
- 学生成绩管理系统 在C++中,表达式必须具有指向对象类型的指针
- Q系统关闭时未销毁的子对象
- 如果堆分配的对象被销毁并且指针被重新分配,Qt的信号和插槽系统会工作吗?
- Qt元对象系统:使用带名称的字符串发出信号
- 面向对象的酒店预订系统设计
- 映射到unordered_map中的对象,它是否被系统初始化
- 面向对象菜单系统
- 缓存对象应该直接从文件系统中读取吗?
- Java - Can调用系统.Gc两次,释放底层对象两次
- 用户可能无法在 Linux 系统上打开共享内存对象的原因
- 围绕shared_ptr构建对象系统
- 检查unix系统中是否加载了共享对象