Fix memory leak when cancelling incubation of view items.
authorAndrew den Exter <andrew.den-exter@nokia.com>
Fri, 29 Jun 2012 01:49:33 +0000 (11:49 +1000)
committerQt by Nokia <qt-info@nokia.com>
Sat, 30 Jun 2012 03:31:15 +0000 (05:31 +0200)
Don't cancel incubation of referenced object, but if incubation is
cancelled remove the scriptRef held by the incubator so the data object
can be released, not just when incubation has inititialized but not
finalized an object.

Change-Id: If2d6a4c4409dbd771d7131782023aa5e2d08eeed
Reviewed-by: Martin Jones <martin.jones@nokia.com>
src/quick/items/qquickvisualdatamodel.cpp

index 6f5934e..ddd8e16 100644 (file)
@@ -511,17 +511,19 @@ void QQuickVisualDataModel::cancel(int index)
     Compositor::iterator it = d->m_compositor.find(d->m_compositorGroup, index);
     QQuickVisualDataModelItem *cacheItem = it->inCache() ? d->m_cache.at(it.cacheIndex) : 0;
     if (cacheItem) {
-        if (cacheItem->incubationTask) {
+        if (cacheItem->incubationTask && !cacheItem->isObjectReferenced()) {
             d->releaseIncubator(cacheItem->incubationTask);
             cacheItem->incubationTask = 0;
-        }
-        if (cacheItem->object && !cacheItem->isObjectReferenced()) {
-            QObject *object = cacheItem->object;
-            cacheItem->destroyObject();
-            if (QQuickItem *item = qmlobject_cast<QQuickItem *>(object))
-                d->emitDestroyingItem(item);
-            else if (QQuickPackage *package = qmlobject_cast<QQuickPackage *>(object))
-                d->emitDestroyingPackage(package);
+
+            if (cacheItem->object) {
+                QObject *object = cacheItem->object;
+                cacheItem->destroyObject();
+                if (QQuickItem *item = qmlobject_cast<QQuickItem *>(object))
+                    d->emitDestroyingItem(item);
+                else if (QQuickPackage *package = qmlobject_cast<QQuickPackage *>(object))
+                    d->emitDestroyingPackage(package);
+            }
+
             cacheItem->scriptRef -= 1;
         }
         if (!cacheItem->isReferenced()) {