QGraphicsScene::~QGraphicsScene() segmentation fault
Asked Answered
B

1

4

Good day!

With Qt 4.7.3 an example below crashes at QGraphicsScene::~QGraphicsScene() call:

#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;
}

Any ideas?

UPDATE:

Bug report created.

Biquarterly answered 28/10, 2011 at 13:34 Comment(3)
Is this your actual code? What is new QGraphicsScene( &app ); supposed to do?Valuator
yes, it's actual code after many simplifications. This line creates unnamed object in heap. I don't have any other files and use qmake for application building.Biquarterly
Yes, and when 'app' leaves scope it deletes child objects - QGraphicsScene instance.Biquarterly
M
3

When a QGraphicsScene instance is constructed it appends itself in a list stored in a private member of the single QApplication instance, and when it is deleted, it also remove itself from that list:

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

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

    ...
}

When the application object is destroyed, the inherited base class' destructors are called recursively, so, ~QApplication() calls ~QCoreApplication() which itself calls ~QObject().

The actual deletion of child objects is done in ~QObject().
Which means that at the time the scene object is destroyed, all the QApplication members are already destroyed, so ~QGraphicsScene() crashes when it tries to access the list.

My answered 1/11, 2011 at 2:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.