gpt4 book ai didi

c++ - Qt C++ 析构函数需要很长时间才能返回

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:59 26 4
gpt4 key购买 nike

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

显然,那时我希望执行会在调用删除对象后立即返回,几乎是立即执行,但正如我所说,有时这需要很长时间!

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

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

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

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

干杯

最佳答案

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

关于c++ - Qt C++ 析构函数需要很长时间才能返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3557569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com