【发布时间】:2019-08-07 13:20:23
【问题描述】:
我想在单击 Qt 控制台应用程序的关闭按钮之前运行我的析构函数。我在 stackoverflow 上找到了这个,Destructor not called in Qt console scenario。
我尝试获取返回值,然后返回值。但是没有任何帮助。
class MyClass
{
Q_OBJECT
public:
MyClass()
{
qDebug() << "MyClass()";
}
~MyClass()
{
qDebug() << "~MyClass()";
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyClass my;
int ret = a.exec();
qDebug() << "this line will not run.";
return ret;
}
我想知道为什么它不运行我的析构函数。
如果我想运行它。如何?
我希望它在单击关闭按钮时输出MyClass() 和this line will not run. 和~MyClass()。
【问题讨论】:
-
因为在 QCoreApplication 上调用 .exec 会进入主事件循环并等待直到 exit() 被调用。
-
QCoreApplication::exec()的文档对此一目了然......“我们建议您将清理代码连接到aboutToQuit()信号,而不是将其放入应用程序的 @987654331 @ 函数,因为在某些平台上exec()调用可能不会返回。例如,在 Windows 上,当用户注销时,系统会在 Qt 关闭所有顶级窗口后终止进程。因此,不能保证应用程序将在exec()调用之后,有时间退出其事件循环并在main()函数的末尾执行代码。” -
你的类在堆栈上被实例化,一旦你离开你的范围就会被破坏。使用指针在堆上分配它,并在应用程序即将退出时使用 delete 调用析构函数:doc.qt.io/qt-5/qcoreapplication.html#aboutToQuit
-
我现在没有时间写一个答案(所以任何人都可以这样做),但是您的问题的解决方案应该在这两个链接后面找到:doc.qt.io/qt-5/unix-signals.html 和 @987654324 @(注意:不重复,不包括如何在 Qt 中做到这一点)。