diff options
author | Rainer Keller <Rainer.Keller@qt.io> | 2017-04-25 14:58:35 +0200 |
---|---|---|
committer | Rainer Keller <Rainer.Keller@qt.io> | 2017-04-26 06:36:28 +0000 |
commit | 1fdde67ff3ae6ec02a06b08ed82e8653f7b066a8 (patch) | |
tree | a086a844cc940b4308f849b3af44e053eead03bf /src | |
parent | 86ac78bdc0dce95489f3f8af1b4b062f426d399c (diff) |
QQmlApplicationEngine: Fix using invalid pointers
When a root object was deleted before QQmlApplicationEngine the
invalid pointers stayed in the list of root objects leading to crashes
when destructing QQmlApplicationEngine. Root objects are watched for
destruction and removed from the list.
Change-Id: I1babab54dbb7d7b16ed883ada5b3e420ca8690cb
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/qml/qqmlapplicationengine.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/qml/qml/qqmlapplicationengine.cpp b/src/qml/qml/qqmlapplicationengine.cpp index a10dda166c..faab8bf926 100644 --- a/src/qml/qml/qqmlapplicationengine.cpp +++ b/src/qml/qml/qqmlapplicationengine.cpp @@ -57,6 +57,10 @@ QQmlApplicationEnginePrivate::~QQmlApplicationEnginePrivate() void QQmlApplicationEnginePrivate::cleanUp() { + Q_Q(QQmlApplicationEngine); + for (auto obj : qAsConst(objects)) + obj->disconnect(q); + qDeleteAll(objects); #if QT_CONFIG(translation) qDeleteAll(translators); @@ -126,9 +130,12 @@ void QQmlApplicationEnginePrivate::finishLoad(QQmlComponent *c) qWarning() << qPrintable(c->errorString()); q->objectCreated(0, c->url()); break; - case QQmlComponent::Ready: - objects << c->create(); + case QQmlComponent::Ready: { + auto newObj = c->create(); + objects << newObj; + QObject::connect(newObj, &QObject::destroyed, q, [&](QObject *obj) { objects.removeAll(obj); }); q->objectCreated(objects.constLast(), c->url()); + } break; case QQmlComponent::Loading: case QQmlComponent::Null: |