QObject析构函数未被调用

时间:2013-07-09 21:47:20

标签: qt memory-management destructor qobject

我的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或我的代码中的错误吗?

2 个答案:

答案 0 :(得分:3)

请参阅QCoreApplication::exec的文档:

  

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

您使用不当。在Windows关闭后,无法保证exec将被终止。您应该使用aboutToQuit信号来阻止其他线程。如果未发出此信号,则需要在窗口关闭时明确调用QApplication::quit()

答案 1 :(得分:1)

在这种情况下,我不确定这是否是您的代码中的错误,但无论如何不推荐在堆栈中创建QObject

原因是父对象(如果有的话)在销毁时会自动调用delete,但是当对象超出范围时,对象也会自动销毁。因此,对象被销毁两次,这是 Undefined Behavior 。这可能解释了为什么它在一个案例中运作良好,而在另一个案例中运作良好,因为你不能依赖任何一致的行为。

(但在你的情况下,你说析构函数根本没有被称为是很奇怪的......)