diff options
| author | Ulf Hermann <ulf.hermann@qt.io> | 2022-05-09 17:49:17 +0200 |
|---|---|---|
| committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-10-02 10:33:52 +0200 |
| commit | f55e6054f0dc8cccc8e7ee1bd61915c0f0ad5d7e (patch) | |
| tree | f06eea98560d0bd35ec5400d793f64d1092f3a66 | |
| parent | b65145764eeef55906503f3a958afdb8142b0006 (diff) | |
Avoid memory leaks in QQuickListView and tst_qqmlinstantiator
Change-Id: Ieceffedb082e893b54bcda99076df3ccdeff6010
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
(cherry picked from commit cf9c0f0180b65f0f2ad2cf20a35a3d11a7430927)
| -rw-r--r-- | src/quick/items/qquicklistview.cpp | 4 | ||||
| -rw-r--r-- | tests/auto/qml/qqmlinstantiator/tst_qqmlinstantiator.cpp | 20 |
2 files changed, 16 insertions, 8 deletions
diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index 1f538043ec..4aaa61eb0a 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -3708,8 +3708,10 @@ bool QQuickListViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch item = createItem(it.index, QQmlIncubator::Synchronous); if (!item) return false; - if (it.removedAtIndex) + if (it.removedAtIndex) { + releaseItem(item, reusableFlag); continue; + } visibleItems.insert(index, item); if (index == 0) diff --git a/tests/auto/qml/qqmlinstantiator/tst_qqmlinstantiator.cpp b/tests/auto/qml/qqmlinstantiator/tst_qqmlinstantiator.cpp index d5587432de..7d53762efa 100644 --- a/tests/auto/qml/qqmlinstantiator/tst_qqmlinstantiator.cpp +++ b/tests/auto/qml/qqmlinstantiator/tst_qqmlinstantiator.cpp @@ -59,7 +59,8 @@ void tst_qqmlinstantiator::createNone() { QQmlEngine engine; QQmlComponent component(&engine, testFileUrl("createNone.qml")); - QQmlInstantiator *instantiator = qobject_cast<QQmlInstantiator*>(component.create()); + QScopedPointer<QObject> o(component.create()); + QQmlInstantiator *instantiator = qobject_cast<QQmlInstantiator*>(o.data()); QVERIFY(instantiator != nullptr); QCOMPARE(instantiator->isActive(), true); QCOMPARE(instantiator->count(), 0); @@ -71,7 +72,8 @@ void tst_qqmlinstantiator::createSingle() { QQmlEngine engine; QQmlComponent component(&engine, testFileUrl("createSingle.qml")); - QQmlInstantiator *instantiator = qobject_cast<QQmlInstantiator*>(component.create()); + QScopedPointer<QObject> o(component.create()); + QQmlInstantiator *instantiator = qobject_cast<QQmlInstantiator*>(o.data()); QVERIFY(instantiator != nullptr); QCOMPARE(instantiator->isActive(), true); QCOMPARE(instantiator->count(), 1); @@ -88,7 +90,8 @@ void tst_qqmlinstantiator::createMultiple() { QQmlEngine engine; QQmlComponent component(&engine, testFileUrl("createMultiple.qml")); - QQmlInstantiator *instantiator = qobject_cast<QQmlInstantiator*>(component.create()); + QScopedPointer<QObject> o(component.create()); + QQmlInstantiator *instantiator = qobject_cast<QQmlInstantiator*>(o.data()); QVERIFY(instantiator != nullptr); QCOMPARE(instantiator->isActive(), true); QCOMPARE(instantiator->count(), 10); @@ -106,7 +109,8 @@ void tst_qqmlinstantiator::stringModel() { QQmlEngine engine; QQmlComponent component(&engine, testFileUrl("stringModel.qml")); - QQmlInstantiator *instantiator = qobject_cast<QQmlInstantiator*>(component.create()); + QScopedPointer<QObject> o(component.create()); + QQmlInstantiator *instantiator = qobject_cast<QQmlInstantiator*>(o.data()); QVERIFY(instantiator != nullptr); QCOMPARE(instantiator->isActive(), true); QCOMPARE(instantiator->count(), 4); @@ -123,7 +127,8 @@ void tst_qqmlinstantiator::activeProperty() { QQmlEngine engine; QQmlComponent component(&engine, testFileUrl("inactive.qml")); - QQmlInstantiator *instantiator = qobject_cast<QQmlInstantiator*>(component.create()); + QScopedPointer<QObject> o(component.create()); + QQmlInstantiator *instantiator = qobject_cast<QQmlInstantiator*>(o.data()); QVERIFY(instantiator != nullptr); QSignalSpy activeSpy(instantiator, SIGNAL(activeChanged())); QSignalSpy countSpy(instantiator, SIGNAL(countChanged())); @@ -178,7 +183,8 @@ void tst_qqmlinstantiator::intModelChange() { QQmlEngine engine; QQmlComponent component(&engine, testFileUrl("createMultiple.qml")); - QQmlInstantiator *instantiator = qobject_cast<QQmlInstantiator*>(component.create()); + QScopedPointer<QObject> o(component.create()); + QQmlInstantiator *instantiator = qobject_cast<QQmlInstantiator*>(o.data()); QVERIFY(instantiator != nullptr); QSignalSpy activeSpy(instantiator, SIGNAL(activeChanged())); QSignalSpy countSpy(instantiator, SIGNAL(countChanged())); @@ -214,7 +220,7 @@ void tst_qqmlinstantiator::createAndRemove() QScopedPointer<StringModel> model {new StringModel("model1")}; qmlRegisterSingletonInstance("Test", 1, 0, "Model1", model.get()); QQmlComponent component(&engine, testFileUrl("createAndRemove.qml")); - QObject *rootObject = component.create(); + QScopedPointer<QObject> rootObject(component.create()); QVERIFY(rootObject != nullptr); QQmlInstantiator *instantiator = |
