From 1fdde67ff3ae6ec02a06b08ed82e8653f7b066a8 Mon Sep 17 00:00:00 2001 From: Rainer Keller Date: Tue, 25 Apr 2017 14:58:35 +0200 Subject: 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 --- src/qml/qml/qqmlapplicationengine.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'src') 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: -- cgit v1.2.3