【问题标题】:Qt C++ destructor taking a long time to returnQt C++ 析构函数需要很长时间才能返回
【发布时间】:2011-04-03 05:20:10
【问题描述】:

我正在开发一个非常标准的 Qt 移动应用程序(用 C++ 编写,针对 Symbian 设备),我发现有时当应用程序关闭时(即通过调用 QApplication::quit),最终的析构函数在应用程序中可能需要很长时间才能返回(30 秒以上)。我的意思是,析构函数中的所有清理操作都已完成(很快,一秒钟之内),我们已经到达执行离开析构函数并返回隐式调用它的代码的地步(即当我们删除对象)。

显然,那时我希望执行在调用删除对象之后立即返回,但正如我所说,有时这需要一段时间!

这种较长的关闭时间发生在调试和发布版本中,启用或禁用日志记录,所以我认为这不是一个因素。当我们到达析构函数的末尾时,我很确定没有文件句柄处于打开状态,或任何其他打开的资源(网络连接等)......尽管即使它们肯定不会出现问题退出析构函数 (?)。

这是关于删除应用程序的 QMainWindow 对象。目前,执行此操作的调用位于连接到 QApplication::aboutToQuit 的插槽中,尽管我也尝试在应用程序的“main”函数中删除该对象。

我们经历的延迟时间似乎与我们退出前应用中的活动量成正比。这种让我觉得内存泄漏在这里可能是个问题,但是我们不知道有任何问题(当然并不意味着 没有),而且我从未见过这种行为之前存在内存泄漏。

有人知道这里会发生什么吗?

干杯

【问题讨论】:

  • 如果您也使用调试器,您是否也遇到过这个问题?你能隔离需要这么长时间的代码行吗?
  • 是的,我也在调试器中看到了这一点。就隔离哪些代码段花费太长时间而言,问题是从析构函数本身返回时会发生延迟。所以析构函数中的最后一行已经完成执行,然后我们将退出析构函数,此时延迟发生了。我相信 Qt 框架当时正在做一些导致延迟的事情,尽管我还不知道是什么。

标签: c++ qt symbian destructor


【解决方案1】:

如果您的最终析构函数用于继承 QObject 的类,则 QObject 析构函数将在您的最终对象的析构函数之后立即调用。大概这个对象是一个可能很大的对象树的根,它将触发许多动作发生,包括调用所有子 QObjects 的析构函数。由于您声明问题是由活动量构成的,因此此时可能有大量子项被添加到对象树中被删除,可能比您预期的要多。而不是将所有对象添加到一棵巨大的树中以一次全部删除。识别不需要在整个执行过程中持续存在的经常创建的对象。与其使用父对象创建这些对象,不如启动一个可以更早删除的新树(父对象 =0)。查看 QObject::deleteLater() ,它将等到没有用户交互来删除这些独立树中的对象。

【讨论】:

  • 我已经开始删除一些育儿方法并改用 deleteLater,我发现销毁时间有了显着改善。很棒的东西,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多