QGraphicsScene :: ~ QGraphicsScene () ошибка сегментации - PullRequest
3 голосов
/ 28 октября 2011

Добрый день!

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

Есть идеи?

ОБНОВЛЕНИЕ:

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

1 Ответ

2 голосов
/ 01 ноября 2011

Когда создается экземпляр 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() вылетает при попытке доступа к списку.

...