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

bus*_*a83 5 c++ qt destructor symbian

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

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

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

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

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

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

干杯

Ste*_*ven 4

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