summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
diff options
context:
space:
mode:
authorThomas McGuire <thomas.mcguire.qnx@kdab.com>2012-08-15 09:50:47 +0200
committerQt by Nokia <qt-info@nokia.com>2012-09-14 13:33:45 +0200
commitecc432a5b7ae269220f86c6f0b3dd364f8643191 (patch)
tree66c9f0ecc280d9b71e677266f533ce9edafa0f94 /src/declarative/qml/qdeclarativeobjectscriptclass.cpp
parent3414828ccc91da0d94f3b160f29766b9273357ad (diff)
Delete JS-owned QML objects right away in the engine dtor.
This prevents memory leaks when the engine is destroyed after exec() has already finished. In most cases this happens during application shutdown, at which point the event loop is never entered again. Task-number: QTBUG-20377 Change-Id: I65564ed3e56314d656d92fd66f11ae67d4eb932b Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@nokia.com> Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Diffstat (limited to 'src/declarative/qml/qdeclarativeobjectscriptclass.cpp')
-rw-r--r--src/declarative/qml/qdeclarativeobjectscriptclass.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
index 8f8557fff3..f71a64d578 100644
--- a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
+++ b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
@@ -74,14 +74,28 @@ struct ObjectData : public QScriptDeclarativeClass::Object {
}
}
- virtual ~ObjectData() {
+ enum Disposal { Immediate, Deferred };
+
+ inline void disposeObject(Disposal disposal) {
if (object && !object->parent()) {
QDeclarativeData *ddata = QDeclarativeData::get(object, false);
- if (ddata && !ddata->indestructible && 0 == --ddata->objectDataRefCount)
- object->deleteLater();
+ if (ddata && !ddata->indestructible && 0 == --ddata->objectDataRefCount) {
+ if (disposal == Immediate)
+ delete object;
+ else
+ object->deleteLater();
+ }
}
}
+ virtual void disposeNow() {
+ disposeObject(Immediate);
+ }
+
+ virtual ~ObjectData() {
+ disposeObject(Deferred);
+ }
+
QDeclarativeGuard<QObject> object;
int type;
};