【发布时间】:2011-04-03 05:20:10
【问题描述】:
我正在开发一个非常标准的 Qt 移动应用程序(用 C++ 编写,针对 Symbian 设备),我发现有时当应用程序关闭时(即通过调用 QApplication::quit),最终的析构函数在应用程序中可能需要很长时间才能返回(30 秒以上)。我的意思是,析构函数中的所有清理操作都已完成(很快,一秒钟之内),我们已经到达执行离开析构函数并返回隐式调用它的代码的地步(即当我们删除对象)。
显然,那时我希望执行在调用删除对象之后立即返回,但正如我所说,有时这需要一段时间!
这种较长的关闭时间发生在调试和发布版本中,启用或禁用日志记录,所以我认为这不是一个因素。当我们到达析构函数的末尾时,我很确定没有文件句柄处于打开状态,或任何其他打开的资源(网络连接等)......尽管即使它们肯定不会出现问题退出析构函数 (?)。
这是关于删除应用程序的 QMainWindow 对象。目前,执行此操作的调用位于连接到 QApplication::aboutToQuit 的插槽中,尽管我也尝试在应用程序的“main”函数中删除该对象。
我们经历的延迟时间似乎与我们退出前应用中的活动量成正比。这种让我觉得内存泄漏在这里可能是个问题,但是我们不知道有任何问题(当然并不意味着 没有),而且我从未见过这种行为之前存在内存泄漏。
有人知道这里会发生什么吗?
干杯
【问题讨论】:
-
如果您也使用调试器,您是否也遇到过这个问题?你能隔离需要这么长时间的代码行吗?
-
是的,我也在调试器中看到了这一点。就隔离哪些代码段花费太长时间而言,问题是从析构函数本身返回时会发生延迟。所以析构函数中的最后一行已经完成执行,然后我们将退出析构函数,此时延迟发生了。我相信 Qt 框架当时正在做一些导致延迟的事情,尽管我还不知道是什么。
标签: c++ qt symbian destructor