C++ QApplication子对象在系统关闭时未被销毁

C++ QApplication子对象在系统关闭时未被销毁,c++,qt,C++,Qt,我有一个Qt应用程序,只有一个对话框窗口。主要内容如下所示: QApplication a(argc, argv); MyObject * myMobject = new QObject(&a); MainWindow w; w.show(); return a.exec(); MyObject构造函数创建一个临时文件,析构函数删除它 当我通过关闭对话框正常关闭应用程序时,MyObject析构函数按预期被调用,因为它是QApplication的子对象,该子对象在main()中的堆栈上分

我有一个Qt应用程序,只有一个对话框窗口。主要内容如下所示:

QApplication a(argc, argv);
MyObject * myMobject = new QObject(&a);
MainWindow w;
w.show();
return a.exec();
MyObject
构造函数创建一个临时文件,析构函数删除它

当我通过关闭对话框正常关闭应用程序时,
MyObject
析构函数按预期被调用,因为它是
QApplication
的子对象,该子对象在
main()
中的堆栈上分配

但是,当用户会话关闭(注销、关闭等)时,文件不会被删除,这表明从未调用过
MyObject
destructor

这是什么原因?我认为Windows在会话关闭之前关闭了所有窗口,但我的进程似乎已终止

文档中有
QCoreApplication::aboutToQuit()
信号。但是这个文档告诉我们,Qt检测到关机并退出事件循环,在最后发出这个信号


如果确实是这样,
a.exec()
应该返回,与窗口关闭时完全相同,
QApplication
应该与其子项一起销毁,调用
MyObject
析构函数。换句话说,由于
myObject
a
的子对象,因此不需要直接从QApplication的文档中处理
aboutToQuit()
信号。

我们建议您将清理代码连接到aboutToQuit()信号,而不是将其放入应用程序的main()函数中。这是因为,在某些平台上,QApplication::exec()调用可能不会返回。例如,在Windows平台上,当用户注销时,系统会在Qt关闭所有顶级窗口后终止进程。因此,不能保证应用程序在QApplication::exec()调用之后有时间退出其事件循环并在main()函数末尾执行代码


我在最后补充了一些关于这方面的信息。另一篇帖子没有回答这个问题该死,我是RTFM'd。不过,他们本可以将此添加到aboutToQuit()中