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

时间:2010-08-24 14:33:46

标签: c++ qt symbian destructor

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

显然,在那一点上,我希望执行会在调用删除对象之后立即返回,但是正如我所说的那样,这有时候需要一个年龄!

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

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

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

有没有人想到这里会发生什么?

干杯

1 个答案:

答案 0 :(得分:4)

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