summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-03-20 16:42:20 +0100
committerUlf Hermann <ulf.hermann@qt.io>2023-03-29 18:07:26 +0100
commit5db77fb406bb36a27de1ad2e3390720411c833f9 (patch)
treef3ab9cdd5e8c693c22e2b3357967e50d23b53636
parent6913084b0d649b78dc10b80cd9b8d77d51a50c8b (diff)
downloadqtdeclarative-5db77fb406bb36a27de1ad2e3390720411c833f9.tar.gz
QQmlInstantiator: Avoid memory leaks
The instance model really wants to manage its objects' life cycle. Therefore, renounce ownership of the objects when the instantiator is cleared, so that it can do its work. Also, clear() on destruction in order to avoid dangling objects. Fixes: QTBUG-112151 Change-Id: Ieed0108d3c7ca3a47f3b5576e500d6cf3cfcdda4 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r--src/qmlmodels/qqmlinstantiator.cpp20
-rw-r--r--src/qmlmodels/qqmlinstantiator_p_p.h1
2 files changed, 11 insertions, 10 deletions
diff --git a/src/qmlmodels/qqmlinstantiator.cpp b/src/qmlmodels/qqmlinstantiator.cpp
index fca56dd45a..63ceda37d8 100644
--- a/src/qmlmodels/qqmlinstantiator.cpp
+++ b/src/qmlmodels/qqmlinstantiator.cpp
@@ -29,25 +29,25 @@ QQmlInstantiatorPrivate::QQmlInstantiatorPrivate()
{
}
-QQmlInstantiatorPrivate::~QQmlInstantiatorPrivate()
-{
- qDeleteAll(objects);
-}
-
void QQmlInstantiatorPrivate::clear()
{
Q_Q(QQmlInstantiator);
if (!instanceModel)
return;
- if (!objects.size())
+
+ if (objects.isEmpty())
return;
for (int i=0; i < objects.size(); i++) {
- q->objectRemoved(i, objects[i]);
- instanceModel->release(objects[i]);
+ QObject *object = objects[i];
+ emit q->objectRemoved(i, object);
+ instanceModel->release(object);
+ if (object && object->parent() == q)
+ object->setParent(nullptr);
}
+
objects.clear();
- q->objectChanged();
+ emit q->objectChanged();
}
QObject *QQmlInstantiatorPrivate::modelObject(int index, bool async)
@@ -207,6 +207,8 @@ QQmlInstantiator::QQmlInstantiator(QObject *parent)
QQmlInstantiator::~QQmlInstantiator()
{
+ Q_D(QQmlInstantiator);
+ d->clear();
}
/*!
diff --git a/src/qmlmodels/qqmlinstantiator_p_p.h b/src/qmlmodels/qqmlinstantiator_p_p.h
index 49bd54f010..3304ac0f8f 100644
--- a/src/qmlmodels/qqmlinstantiator_p_p.h
+++ b/src/qmlmodels/qqmlinstantiator_p_p.h
@@ -31,7 +31,6 @@ class Q_QMLMODELS_PRIVATE_EXPORT QQmlInstantiatorPrivate : public QObjectPrivate
public:
QQmlInstantiatorPrivate();
- ~QQmlInstantiatorPrivate();
void clear();
void regenerate();