何时调用QApplication析构函数

时间:2012-04-28 14:36:40

标签: c++ qt valgrind

所以我意识到实际上我真的不需要做我要解释的事情,但我非常挑剔地确保我的程序在退出之前清理所有内容所以我仍然想做它...

我有一个QApplication,我将单次定时器连接到退出插槽。 (在未来想象这个退出实际上是从用户点击的UI生成的,所以这只是用于调试)我注意到,起初我只是在堆栈的主函数中分配qApp。问题在于做一些研究似乎exec函数没有必要返回。这意味着主功能堆栈无法清理。 (或者至少在程序退出并且系统回收内存之前......)所以在valgrind中我有一些QCoreApplication :: init()内存“问题”。再一次,只是我挑剔然后真正影响事情......

无论如何所以我决定对QApplication进行malloc,然后在程序关闭之前尝试释放它。我可以为信号做这个,但退出信号怎么样?我被捆绑在aboutToQuit信号中,但我觉得这不是吹走qApp的正确阶段。所以我的问题是,是否有一个正确的位置来删除qApp,如果是的话在哪里?

1 个答案:

答案 0 :(得分:2)

  

问题在于进行一些研究似乎exec函数无需返回。

嗯,是的,如果你的过程无论如何崩溃和焚烧,也没有“必须”返回,即如果你直接或间接地打电话 - std::terminate()::abort(),{{ 1}}等等。这些库函数用于快速终止进程,您的问题不仅限于::exit()实例。 调用堆栈中的每个对象,在每个线程中都会被泄露,并且其中一些对象既没有访问权限也没有任何控制权 - 运行时和库创建他们 - 你无能为力。 非归还QApplication的情况属于例外情况,而不是您的程序应该正常结束的方式。就“exec()未返回时该怎么做:什么都没有。到那时为时已晚。

因此 - 不要抛弃未捕获的异常,不要exec()::exit(),也不要担心。在每个表现良好的Qt程序中,::abort()都会返回。