diff options
| author | Ulf Hermann <ulf.hermann@qt.io> | 2023-03-20 16:42:20 +0100 |
|---|---|---|
| committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-03-29 18:07:26 +0100 |
| commit | 5db77fb406bb36a27de1ad2e3390720411c833f9 (patch) | |
| tree | f3ab9cdd5e8c693c22e2b3357967e50d23b53636 | |
| parent | 6913084b0d649b78dc10b80cd9b8d77d51a50c8b (diff) | |
| download | qtdeclarative-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.cpp | 20 | ||||
| -rw-r--r-- | src/qmlmodels/qqmlinstantiator_p_p.h | 1 |
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(); |
