diff --git a/src/arraybuffer.cpp b/src/arraybuffer.cpp
index 3b35b7cc0162eab0c7fdef47e4ee588d4ebeaa0f..f35d8ec42c9826085c68bb3b72f4259ac371ef97 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 39b458afe9df01124b064682c7ef179da3422412..e161522eaa0ab7a8fa10ecfc38380a50f90bbca4 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 a82277cd91b856e500f0b0a88076005f4212c43d..c05fc8a4c1f01fc003a28aab6deab1821fffc02f 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 601e3184895f7637e4c56ee36c14936408edcabd..e9836c802d8095a36ff03087de0d13e6211575c2 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);
 }
 
 /*!