【问题标题】:When to call the QApplication destructor何时调用 QApplication 析构函数
【发布时间】:2012-04-28 14:36:39
【问题描述】:

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

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

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

【问题讨论】:

  • 你不应该删除你的 QApplication(因为它不应该使用new 创建),因此答案是否定的。
  • 如果是这种情况,那么如果我不能保证析构函数在堆栈上会被调用,那么 qAddPostRoutine 的意义何在?
  • 在 QCoreApplication 文档中,它解释了什么类型的情况使 QApplication::exec 不返回。即使您确实找到了删除 QApplication 的“正确方法”,您也无能为力。将其分配到堆栈上,然后让这些东西自行删除。
  • 请注意,析构函数确实会为堆栈上的对象调用。

标签: c++ qt valgrind


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-11-28
    • 2021-11-27
    • 2014-05-17
    • 2018-09-01
    • 1970-01-01
    • 2011-04-16
    • 2017-02-08
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多