diff -ruN qtdeclarative-opensource-src-5.0.2_with_03/src/quick/items/qquickvisualdatamodel.cpp qtdeclarative-opensource-src-5.0.2/src/quick/items/qquickvisualdatamodel.cpp --- qtdeclarative-opensource-src-5.0.2_with_03/src/quick/items/qquickvisualdatamodel.cpp 2013-05-06 14:14:37.365597337 +0000 +++ qtdeclarative-opensource-src-5.0.2/src/quick/items/qquickvisualdatamodel.cpp 2013-05-06 14:45:20.013520272 +0000 @@ -211,6 +211,8 @@ cacheItem->objectRef = 0; if (!cacheItem->isReferenced()) delete cacheItem; + else if (cacheItem->incubationTask) + cacheItem->incubationTask->vdm = 0; } } @@ -764,7 +766,21 @@ void QVDMIncubationTask::statusChanged(Status status) { - vdm->incubatorStatusChanged(this, status); + if (vdm) { + vdm->incubatorStatusChanged(this, status); + } else if (status == QQmlIncubator::Ready || status == QQmlIncubator::Error) { + Q_ASSERT(incubating); + // The model was deleted from under our feet, cleanup ourselves + if (incubating->object) { + delete incubating->object; + + incubating->object = 0; + incubating->contextData->destroy(); + incubating->contextData = 0; + } + incubating->scriptRef = 0; + incubating->deleteLater(); + } } void QQuickVisualDataModelPrivate::releaseIncubator(QVDMIncubationTask *incubationTask) @@ -1757,8 +1773,12 @@ Q_ASSERT(objectRef == 0); Q_ASSERT(!object); - if (incubationTask && metaType->model) - QQuickVisualDataModelPrivate::get(metaType->model)->releaseIncubator(incubationTask); + if (incubationTask) { + if (metaType->model) + QQuickVisualDataModelPrivate::get(metaType->model)->releaseIncubator(incubationTask); + else + delete incubationTask; + } metaType->release();