3

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

4

2 回答 2

3

请参阅以下文档QCoreApplication::exec

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

你使用不正确。不保证exec会在窗口关闭后终止。您应该使用aboutToQuit信号来停止其他线程。如果此信号也未发出,则需要QApplication::quit()在窗口关闭时显式调用。

于 2013-07-10T15:37:24.077 回答
1

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

原因是父对象(如果有的话)delete在销毁时会自动调用,但是当对象超出范围时也会自动销毁。因此,该对象被销毁两次,即Undefined Behavior。这可以解释为什么它在一种情况下运行良好,而在另一种情况下却不行,因为您不能依赖任何一致的行为。

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

于 2013-07-10T01:11:22.007 回答