QObject析构函数未被调用

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还是我的代码有bug呢?

1
给出的警告似乎更像是安装了两个不同版本的同一库。 - Sebastian Lange
请展示如何创建对象。错误信息似乎与问题无关。 - Pavel Strakhov
@Riateche 它们是在主函数中栈上创建的(而不是动态分配的)。 - sj755
你如何停止应用程序?也许它已经崩溃了,没有正常退出。你为这些对象指定“parent”对象吗? - Pavel Strakhov
@Riateche 这个应用程序是多线程的。当你关闭窗口时,它会退出。额外的线程在启动线程的对象的析构函数中被终止。这些对象没有父级。析构函数应该在我们离开主函数时被调用。然而,析构函数从未被调用,额外的线程继续运行并打印它们的结果。 - sj755
显示剩余2条评论
2个回答

3
请参阅QCoreApplication::exec的文档:
我们建议将清理代码连接到aboutToQuit()信号,而不是将其放在应用程序的main()函数中,因为在某些平台上,QCoreApplication :: exec()调用可能不会返回。例如,当用户注销Windows时,系统在Qt关闭所有顶级窗口后终止进程。因此,在QCoreApplication :: exec()调用后,没有保证应用程序有时间退出其事件循环并执行main()函数末尾的代码。
您正在错误使用它。不能保证在窗口关闭后仍会终止exec。您应该使用aboutToQuit信号停止其他线程。如果这个信号也没有发出,则在窗口关闭时需要显式调用QApplication::quit()

exec虽然会返回,但未被删除的QObjects会导致进程无法退出,因为这些QObjects用于启动单独的线程,在析构函数被调用之前不会被终止。 - sj755
刚在不同的机器上测试了我的应用程序。似乎我没有在其中一个QObjects上实现一个好的析构函数。它会挂起等待线程加入回来。 - sj755

1
我不确定在这种情况下这是否是您代码中的错误,但无论如何,不建议在堆栈中创建QObject
原因是父对象(如果有)在销毁时会自动调用delete,但当对象超出范围时也会自动销毁。因此,该对象被销毁两次,这是未定义行为。这可能解释了为什么它在某些情况下表现良好,在另一种情况下则不是,因为您无法依赖任何一致的行为。
(但在您的情况下,奇怪的是您说析构函数根本没有被调用...)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接