diff options
author | Andrew den Exter <andrew.den-exter@nokia.com> | 2012-06-29 11:49:33 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-30 05:31:15 +0200 |
commit | a27feb5a95aa0756bbc37de32434111752f44e4e (patch) | |
tree | 99f63ddb5cca546d6036df818d62189c8c6e3d6c /src/quick/items/qquickvisualdatamodel.cpp | |
parent | ad52fcc452b88963c7c373240af89e9f6f494019 (diff) |
Fix memory leak when cancelling incubation of view items.
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>
Diffstat (limited to 'src/quick/items/qquickvisualdatamodel.cpp')
-rw-r--r-- | src/quick/items/qquickvisualdatamodel.cpp | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/quick/items/qquickvisualdatamodel.cpp b/src/quick/items/qquickvisualdatamodel.cpp index 6f5934e4f1..ddd8e16ecf 100644 --- a/src/quick/items/qquickvisualdatamodel.cpp +++ b/src/quick/items/qquickvisualdatamodel.cpp @@ -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()) { |