【问题标题】:why segmentation fault occurs when using a window in a QSharedPointer?为什么在 QSharedPointer 中使用窗口时会出现分段错误?
【发布时间】:2012-02-28 09:21:11
【问题描述】:

我正在使用 Qt 4.7.4(64 位)开发一个 gui proram。我试图将问题隔离如下:

我有一个窗口:class PreferencesWindow : public QMainWindow,在另一个类中我初始化并显示为

QSharedPointer<PreferencesWindow> pPreferencesWindow = QSharedPointer<PreferencesWindow>(new PreferencesWindow());
pPreferencesWindow->show();

一切都很好,然后我通过按ESC 或单击窗口上的x 按钮来关闭窗口。然后我打电话

QApplication::quit();

终止整个程序。它终止,但在终止之前给出了分段错误。

这里的问题是为什么当我使用常规指针而不是QSharedPointer 时它会干净地终止以及如何正确使用QSharedPointer在这种情况下

【问题讨论】:

  • 我想到了一些事情:当QSharedPointer 超出范围或立即在QApplication::quit(); 时崩溃?你真的需要一个共享指针吗?作用域指针会起作用吗?
  • 当我在调用QApplication::quit() 后进行调试时,它会深入到 qt 库代码中,然后我会迷路,所以我不能说它是否超出范围。但我真的需要一个托管指针,因为有时我会手动删除窗口。但我还没有尝试过scopedPointer。无论如何,我现在很好奇“为什么”会这样。
  • 你正在摧毁一些东西两次。当窗口被退出、X 等破坏时,它就完成了。没有更多理由删除任何内容。我可能对范围指针有误。
  • @Ernest Friedman-Hill 的回答是正确的(第 2 段)。我认为当QApplication::quit()被调用时窗口被删除,而不是在按'x'关闭时被删除

标签: c++ qt pointers segmentation-fault qsharedpointer


【解决方案1】:

我不是 Qt 专家,但我的第一个想法是 QMainWindow 在销毁时会自行删除,QSharedPointer 对象也会在对象被销毁时删除(即对象是 deleted 两次)。如果这是真的,您根本不需要使用QSharedPointer

编辑:looks like QtWidget Qt::WA_DeleteOnClose 标志将导致我描述的行为。

【讨论】:

  • 嗨,关于您的编辑,我可以说我没有设置标志,默认情况下它是 false afaik
【解决方案2】:

我怀疑问题是当您关闭窗口时,pPreferencesWindow 指向的数据结构在QSharedPointer 不知情的情况下被删除。当QSharedPointer 本身后来被销毁时,它会双重删除窗口,你会得到段错误。

基本上,与所有共享指针实现一样,要么每个人都玩,要么没人玩。由于 Qt 内部永远不会知道您正在使用智能指针来管理窗口,因此您不能使用智能指针。然而,这是因祸得福。这意味着Qt自己拥有了指针并同意为你管理它,所以你根本不需要智能指针!

【讨论】:

    猜你喜欢
    • 2015-01-27
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2011-04-23
    相关资源
    最近更新 更多