Delete scene if you aren't going to use it.
authorAlan Alpert <alan.alpert@nokia.com>
Wed, 27 Jul 2011 06:25:38 +0000 (16:25 +1000)
committerQt by Nokia <qt-info@nokia.com>
Thu, 28 Jul 2011 03:14:47 +0000 (05:14 +0200)
Also make QDeclarativeOpenMetaObjectType zero its engine when the engine
dies, because this was leading to problems when the scene wasn't
deleted. Also fixes a few other potential deletion problems.

Change-Id: I37fa2d1a0b438a6ea7d8cf4c5c9d0bd869faa959
Reviewed-on: http://codereview.qt.nokia.com/2250
Reviewed-by: Alan Alpert <alan.alpert@nokia.com>
src/declarative/items/qsgpathview.cpp
src/declarative/particles/qsgimageparticle.cpp
src/declarative/particles/qsgmodelparticle.cpp
src/declarative/particles/qsgmodelparticle_p.h
src/declarative/util/qdeclarativeopenmetaobject.cpp
src/declarative/util/qdeclarativeopenmetaobject_p.h
src/qtquick1/util/qdeclarativeview.cpp

index 68ed319..7dd58c5 100644 (file)
@@ -398,7 +398,7 @@ void QSGPathView::setModel(const QVariant &model)
         d->model = vim;
     } else {
         if (!d->ownModel) {
-            d->model = new QSGVisualDataModel(qmlContext(this), this);
+            d->model = new QSGVisualDataModel(qmlContext(this));
             d->ownModel = true;
         }
         if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(d->model))
index 8c04175..e4ba67f 100644 (file)
@@ -59,7 +59,11 @@ class UltraMaterial : public QSGMaterial
 {
 public:
     UltraMaterial(bool withSprites=false)
-        : timestamp(0)
+        : texture(0)
+        , colortable(0)
+        , sizetable(0)
+        , opacitytable(0)
+        , timestamp(0)
         , framecount(1)
         , animcount(1)
         , usesSprites(withSprites)
@@ -69,10 +73,14 @@ public:
 
     ~UltraMaterial()
     {
-        delete texture;
-        delete colortable;
-        delete sizetable;
-        delete opacitytable;
+        if (texture)
+            delete texture;
+        if (colortable)
+            delete colortable;
+        if (sizetable)
+            delete sizetable;
+        if (opacitytable)
+            delete opacitytable;
     }
 
     virtual QSGMaterialType *type() const { static QSGMaterialType type; return &type; }
index 1d06a96..08646e3 100644 (file)
@@ -68,6 +68,12 @@ QSGModelParticle::QSGModelParticle(QSGItem *parent) :
     manageDelegates->start();
 }
 
+QSGModelParticle::~QSGModelParticle()
+{
+    if (m_ownModel)
+        delete m_model;
+}
+
 QVariant QSGModelParticle::model() const
 {
     return m_dataSource;
index 5092ddc..c6dd40d 100644 (file)
@@ -63,6 +63,7 @@ class QSGModelParticle : public QSGParticlePainter
     Q_CLASSINFO("DefaultProperty", "delegate")
 public:
     explicit QSGModelParticle(QSGItem *parent = 0);
+    virtual ~QSGModelParticle();
     QVariant model() const;
     void setModel(const QVariant &);
 
index cab2888..a5f47c2 100644 (file)
@@ -66,7 +66,7 @@ public:
 };
 
 QDeclarativeOpenMetaObjectType::QDeclarativeOpenMetaObjectType(const QMetaObject *base, QDeclarativeEngine *engine)
-    : d(new QDeclarativeOpenMetaObjectTypePrivate)
+    : QDeclarativeCleanup(engine), d(new QDeclarativeOpenMetaObjectTypePrivate)
 {
     d->engine = engine;
     d->init(base);
@@ -81,6 +81,10 @@ QDeclarativeOpenMetaObjectType::~QDeclarativeOpenMetaObjectType()
     delete d;
 }
 
+void QDeclarativeOpenMetaObjectType::clear()
+{
+    d->engine = 0;
+}
 
 int QDeclarativeOpenMetaObjectType::propertyOffset() const
 {
index 602f2c4..e5cfee7 100644 (file)
@@ -46,6 +46,7 @@
 #include <QtCore/QObject>
 
 #include <private/qdeclarativerefcount_p.h>
+#include <private/qdeclarativecleanup_p.h>
 #include <private/qdeclarativeglobal_p.h>
 #include <private/qobject_p.h>
 
@@ -58,7 +59,7 @@ QT_MODULE(Declarative)
 class QDeclarativeEngine;
 class QMetaPropertyBuilder;
 class QDeclarativeOpenMetaObjectTypePrivate;
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeOpenMetaObjectType : public QDeclarativeRefCount
+class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeOpenMetaObjectType : public QDeclarativeRefCount, public QDeclarativeCleanup
 {
 public:
     QDeclarativeOpenMetaObjectType(const QMetaObject *base, QDeclarativeEngine *engine);
@@ -71,6 +72,7 @@ public:
 
 protected:
     virtual void propertyCreated(int, QMetaPropertyBuilder &);
+    virtual void clear();
 
 private:
     QDeclarativeOpenMetaObjectTypePrivate *d;
index cc19828..32f2183 100644 (file)
@@ -602,6 +602,8 @@ void QDeclarativeView::setRootObject(QObject *obj)
                 widget->setVisible(true);
             }
             resize(widget->size());
+        }else{
+            delete obj;
         }
     }