【问题标题】:QObject destructors not being called未调用 QObject 析构函数
【发布时间】:2013-07-07 16:29:59
【问题描述】:

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

【问题讨论】:

  • 给定的警告看起来更像是安装了同一个库的两个不同版本
  • 请展示您如何创建对象。错误消息似乎与问题无关。
  • @Riateche 它们是在堆栈上的主函数中创建的(不是动态分配的)。
  • @SebastianLange 实际上,我确实有两个版本的libfreebl3.so。一个位于/lib64,另一个位于/usr/lib64。它们彼此不匹配。
  • 如何停止应用程序?可能是崩溃了,没有正常退出。您是否为这些对象指定 parent 对象?

标签: qt memory-management destructor qobject


【解决方案1】:

查看QCoreApplication::exec的文档:

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

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

【讨论】:

  • exec 确实返回了。未被删除的 QObject 导致进程无法退出,因为这些 QObject 被用于启动单独的线程,这些线程在调用析构函数之前不会被杀死。
  • 刚刚在不同的机器上测试了我的应用程序。似乎我没有在我的一个 QObjects 上实现一个好的析构函数。它会挂起等待线程重新加入。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 2017-04-28
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    相关资源
    最近更新 更多