我的Qt应用程序中有两个QObject
子类。每个类中的一个对象在堆栈上实例化。以前,我的申请会干净利落地退出。但是,由于我已更新到Qt5.1.0,因此不会调用它们的析构函数。启动调试器时,我收到以下警告两次。
the debug information found in "/usr/lib/debug//lib64/libfreebl3.so.debug"
does not match "/lib64/libfreebl3.so" (CRC mismatch)
这是Qt或我的代码中的错误吗?
答案 0 :(得分:3)
请参阅QCoreApplication::exec
的文档:
我们建议您将清理代码连接到aboutToQuit()信号,而不是将其放在应用程序的main()函数中,因为在某些平台上,QCoreApplication :: exec()调用可能不会返回。例如,在Windows上用户注销时,系统会在Qt关闭所有顶级窗口后终止进程。因此,无法保证应用程序有时间退出其事件循环并在QCoreApplication :: exec()调用之后在main()函数结束时执行代码。
您使用不当。在Windows关闭后,无法保证exec
将被终止。您应该使用aboutToQuit
信号来阻止其他线程。如果未发出此信号,则需要在窗口关闭时明确调用QApplication::quit()
。
答案 1 :(得分:1)
在这种情况下,我不确定这是否是您的代码中的错误,但无论如何不推荐在堆栈中创建QObject
。
原因是父对象(如果有的话)在销毁时会自动调用delete
,但是当对象超出范围时,对象也会自动销毁。因此,对象被销毁两次,这是 Undefined Behavior 。这可能解释了为什么它在一个案例中运作良好,而在另一个案例中运作良好,因为你不能依赖任何一致的行为。
(但在你的情况下,你说析构函数根本没有被称为是很奇怪的......)