4

再会!

对于 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;
}

有任何想法吗?

更新:

已创建错误报告

4

1 回答 1

3

当一个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()它本身调用~QObject().

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

于 2011-11-01T02:19:23.507 回答