2

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

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

无论如何,所以我决定 malloc QApplication 然后尝试在程序关闭之前释放它。我可以对信号执行此操作,但退出信号如何?我与 aboutToQuit 信号有关,但我觉得这不是吹走 qApp 的正确阶段。所以我的问题是,是否有删除 qApp 的正确位置,如果是,在哪里?

4

1 回答 1

2

问题是在做一些研究时,似乎 exec 函数不必返回。

好吧,是的,如果你的进程无论如何都崩溃和烧毁,它没有“必须”返回,即如果你已经调用 - 直接或间接 - std::terminate(), ::abort(),::exit()等。这些库函数用于快速终止进程和你的问题不仅限于QApplication实例。调用堆栈上的每个对象、每个线程中的每个对象都将被泄露,其中一些您既无法访问也无法控制的对象(运行时和库创建它们)而您对此无能为力。不返回的情况exec()是一个例外,而不是您的程序应该结束的正常方式。就“exec()没有返回时该怎么办:什么都没有。到那时为时已晚。

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

于 2018-06-15T16:54:52.123 回答