【问题标题】:When setting the WA_DeleteOnClose attribute on a Qt MainWindow, the program crashes when deleting the ui pointer在 Qt MainWindow 上设置 WA_DeleteOnClose 属性时,程序在删除 ui 指针时崩溃
【发布时间】:2011-03-10 08:24:58
【问题描述】:

我在 MainWindow 中设置了 WA_DeleteOnClose 小部件属性。

setAttribute(Qt::WA_DeleteOnClose);

但是,每当我关闭该主窗口时,我都会在其析构函数中遇到段错误,该析构函数只有 delete ui;

简而言之,在 Creator 中创建了一个 Qt4 GUI 应用程序,将 setAttribute(Qt::WA_DeleteOnClose); 添加到构造函数,程序现在在退出时崩溃。

【问题讨论】:

    标签: c++ qt qt4 segmentation-fault


    【解决方案1】:

    您是第一次还是第二次在其析构函数中遇到段错误?请记住,您的主窗口析构函数应该只运行一次。也就是说,它应该运行 either 因为堆栈展开, 因为 WA_DeleteOnClose,而不是两者。

    IIRC,Creator 会将主窗口放在main() 的堆栈上。因此,当main() 返回时,主窗口被销毁。

    【讨论】:

    • 原来我不小心在堆栈上声明了我的MainWindow 类,而不是main() 中的堆。您的回答使我意识到这一点;谢谢。 :)
    • @JakePetroules MainWindow 通常应该是一个自动变量(“在堆栈上”),问题是你不应该让 Qt 尝试删除它。 C++ 编译器会为你做这件事。普遍存在一种误解,即所有 Qt 对象都必须在堆上显式分配。在许多情况下,这只是额外的和不必要的工作:C++ 语言具有明确定义的范围概念及其与对象生命周期的关系。在你做任何其他事情之前,只要利用它,一切都会好起来的:)
    • 回答您的问题:似乎崩溃发生在第一次调用析构函数时。
    • @LRDPRDX:随着时间的推移,编译器已经进步了一点。特别是,优化器比以往更频繁地对代码进行改组。您可能希望在未优化的构建中验证观察结果。 segfault 是 Undefined Behavior 的结果,Undefined Behavior 的存在往往会破坏优化器。导致导致的崩溃难以调试。
    • @MSalters,与您的评论无关,但无论如何请参阅my 帖子。
    【解决方案2】:

    this link 给出了很好的解决方案建议。

    我觉得最好是定义为QPointer来指向obj,每次使用都测试NULL,这样当UI obj被销毁时,指针直接设置为NULL。 “QPointer 为 QObjects 提供了受保护的指针。您可以使用它来保存对对话框的引用,当对话框被删除时,指针将自动设置为 NULL。”

    【讨论】:

      猜你喜欢
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 2012-03-13
      • 1970-01-01
      • 2016-02-27
      • 2018-02-22
      相关资源
      最近更新 更多