【问题标题】:QGraphicsScene::~QGraphicsScene() segmentation faultQGraphicsScene::~QGraphicsScene() 分段错误
【发布时间】:2011-12-17 07:35:11
【问题描述】:

美好的一天!

对于 Qt 4.7.3,下面的示例在 QGraphicsScene::~QGraphicsScene() 调用时崩溃:

#include <QCoreApplication>
#include <QGraphicsScene>

int main( int argc, char* argv[] )
{
    // replace this with QObject app; and no problems
    QCoreApplication app( argc, argv );

    new QGraphicsScene( &app );

    return 0;
}

有什么想法吗?

更新:

Bug report 已创建。

【问题讨论】:

  • 这是您的实际代码吗? new QGraphicsScene( &amp;app ); 应该做什么?
  • 是的,这是经过多次简化后的实际代码。此行在堆中创建未命名对象。我没有任何其他文件并使用 qmake 构建应用程序。
  • 是的,当 'app' 离开范围时,它会删除子对象 - QGraphicsScene 实例。

标签: qt segmentation-fault qgraphicsscene


【解决方案1】:

QGraphicsScene 实例被构造时,它会将自己附加到存储在单个QApplication 实例的私有成员中的列表中,当它被删除时,它也会从该列表中删除自己:

QGraphicsScene::~QGraphicsScene()
{
    Q_D(QGraphicsScene);

    // Remove this scene from qApp's global scene list.
    qApp->d_func()->scene_list.removeAll(this);

    ...
}

当应用对象被销毁时,继承的基类的析构函数被递归调用,所以~QApplication()调用~QCoreApplication(),而~QCoreApplication()本身又调用~QObject()

子对象的实际删除是在~QObject() 中完成的。
这意味着在场景对象被销毁时,所有QApplication 成员都已被销毁,因此~QGraphicsScene() 在尝试访问列表时会崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多