diff options
author | Thomas McGuire <thomas.mcguire.qnx@kdab.com> | 2012-08-15 09:50:47 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-09-14 13:33:45 +0200 |
commit | ecc432a5b7ae269220f86c6f0b3dd364f8643191 (patch) | |
tree | 66c9f0ecc280d9b71e677266f533ce9edafa0f94 /src/declarative/qml/qdeclarativeobjectscriptclass.cpp | |
parent | 3414828ccc91da0d94f3b160f29766b9273357ad (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.cpp | 20 |
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; }; |