From 9521d02acd14fcb6be60ebb1d976e03d243dbf07 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@theqtcompany.com>
Date: Thu, 6 Nov 2014 15:42:50 +0200
Subject: [PATCH] Fix memory leaks and other related issues.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Change-Id: I7fc9b0592beabc0b0e225bf1f161bdbeaa9dba00
Reviewed-by: Pasi Keränen <pasi.keranen@digia.com>
---
 src/arraybuffer.cpp      |  2 +-
 src/canvas3d.cpp         | 11 +++++------
 src/canvasrendernode.cpp |  1 -
 src/teximage3d.cpp       | 15 +++++++++++++++
 4 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/arraybuffer.cpp b/src/arraybuffer.cpp
index 3b35b7c..f35d8ec 100644
--- a/src/arraybuffer.cpp
+++ b/src/arraybuffer.cpp
@@ -76,7 +76,7 @@ CanvasArrayBuffer::CanvasArrayBuffer(unsigned long length, QObject *parent) :
  */
 CanvasArrayBuffer::~CanvasArrayBuffer()
 {
-    delete m_rawData;
+    delete[] m_rawData;
 }
 
 /*!
diff --git a/src/canvas3d.cpp b/src/canvas3d.cpp
index 39b458a..e161522 100644
--- a/src/canvas3d.cpp
+++ b/src/canvas3d.cpp
@@ -155,15 +155,14 @@ void Canvas::shutDown()
 
     if (m_logAllCalls) qDebug() << m_contextThread << m_mainThread;
 
-    if (m_contextThread && m_contextThread != m_mainThread)
+    if (m_contextThread && m_contextThread != m_mainThread) {
         m_glContext->deleteLater();
-    else
+        m_offscreenSurface->deleteLater();
+    } else {
         delete m_glContext;
+        delete m_offscreenSurface;
+    }
     m_glContext = 0;
-
-    // schedule this to be deleted only after we're done cleaning up
-    m_offscreenSurface->deleteLater();
-
     m_glContextQt = 0;
 }
 
diff --git a/src/canvasrendernode.cpp b/src/canvasrendernode.cpp
index a82277c..c05fc8a 100644
--- a/src/canvasrendernode.cpp
+++ b/src/canvasrendernode.cpp
@@ -59,7 +59,6 @@ CanvasRenderNode::CanvasRenderNode(Canvas *canvas, QQuickWindow *window) :
 
 CanvasRenderNode::~CanvasRenderNode()
 {
-    if (m_canvas->logAllCalls()) qDebug() << "CanvasRenderNode::" << __FUNCTION__;
     delete m_texture;
 }
 
diff --git a/src/teximage3d.cpp b/src/teximage3d.cpp
index 601e318..e9836c8 100644
--- a/src/teximage3d.cpp
+++ b/src/teximage3d.cpp
@@ -38,9 +38,21 @@
 #include "canvas3dcommon_p.h"
 
 #include <QJSValueIterator>
+#include <QtQml/QQmlEngine>
 
 static QMap<QQmlEngine *,CanvasTextureImageFactory *>m_qmlEngineToImageFactoryMap;
 
+class StaticFactoryMapDeleter
+{
+public:
+    StaticFactoryMapDeleter() {}
+    ~StaticFactoryMapDeleter() {
+        foreach (CanvasTextureImageFactory *factory, m_qmlEngineToImageFactoryMap)
+            delete factory;
+    }
+};
+static StaticFactoryMapDeleter staticFactoryMapDeleter;
+
 /*!
  * \internal
  */
@@ -48,6 +60,9 @@ CanvasTextureImageFactory::CanvasTextureImageFactory(QQmlEngine *engine, QObject
     QObject(parent)
 {
     m_qmlEngine = engine;
+
+    QObject::connect(engine, &QObject::destroyed,
+                     this, &CanvasTextureImageFactory::deleteLater);
 }
 
 /*!
-- 
GitLab