Ошибка сегментации QGraphicsScene::~QGraphicsScene()

Добрый день!

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

Любые идеи?

ОБНОВИТЬ:

Создан отчет об ошибке.


person Iakov Minochkin    schedule 28.10.2011    source источник
comment
Это ваш реальный код? Что должен делать new QGraphicsScene( &app );?   -  person Bart    schedule 28.10.2011
comment
да, это настоящий код после многих упрощений. Эта строка создает безымянный объект в куче. У меня нет других файлов, и я использую qmake для создания приложений.   -  person Iakov Minochkin    schedule 28.10.2011
comment
Да, и когда «приложение» покидает область действия, оно удаляет дочерние объекты — экземпляр QGraphicsScene.   -  person Iakov Minochkin    schedule 28.10.2011


Ответы (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(), который сам вызывает ~QObject().

Фактическое удаление дочерних объектов выполняется в ~QObject().
Это означает, что в момент уничтожения объекта сцены все элементы QApplication уже уничтожены, поэтому ~QGraphicsScene() аварийно завершает работу при попытке доступа к списку.

person alexisdm    schedule 01.11.2011