From c467f608ec92d4a2023140a1f212e4b46b892bb8 Mon Sep 17 00:00:00 2001
From: BogDan Vatra <bogdan@kdab.com>
Date: Tue, 25 Jul 2017 09:02:56 +0300
Subject: [PATCH] Fix memleak: delete QGeoMap when QDeclarativeGeoMap gets
 deleted

Task-number: QTBUG-62122
Change-Id: I538e1eeb6bce3f5de424003b0b31fa59599dc2d5
Reviewed-by: Paolo Angelelli <paolo.angelelli@qt.io>
---
 .../declarativemaps/qdeclarativegeomap.cpp    | 36 ++++++++++---------
 .../declarativemaps/qdeclarativegeomap_p.h    |  2 +-
 .../qquickgeomapgesturearea.cpp               |  2 +-
 .../qquickgeomapgesturearea_p.h               |  4 +--
 src/location/maps/qgeomappingmanager.cpp      |  6 ++--
 5 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/src/location/declarativemaps/qdeclarativegeomap.cpp b/src/location/declarativemaps/qdeclarativegeomap.cpp
index f5d2bdb5c..bd9c9cf23 100644
--- a/src/location/declarativemaps/qdeclarativegeomap.cpp
+++ b/src/location/declarativemaps/qdeclarativegeomap.cpp
@@ -241,6 +241,8 @@ QDeclarativeGeoMap::~QDeclarativeGeoMap()
 
     delete m_copyrights.data();
     m_copyrights.clear();
+
+    delete m_map;
 }
 
 /*!
@@ -279,17 +281,17 @@ void QDeclarativeGeoMap::onMapChildrenChanged()
 
             copyrights = m_copyrights.data();
 
-            connect(m_map.data(), SIGNAL(copyrightsChanged(QImage)),
+            connect(m_map, SIGNAL(copyrightsChanged(QImage)),
                     copyrights, SLOT(copyrightsChanged(QImage)));
-            connect(m_map.data(), SIGNAL(copyrightsChanged(QImage)),
+            connect(m_map, SIGNAL(copyrightsChanged(QImage)),
                     this,  SIGNAL(copyrightsChanged(QImage)));
 
-            connect(m_map.data(), SIGNAL(copyrightsChanged(QString)),
+            connect(m_map, SIGNAL(copyrightsChanged(QString)),
                     copyrights, SLOT(copyrightsChanged(QString)));
-            connect(m_map.data(), SIGNAL(copyrightsChanged(QString)),
+            connect(m_map, SIGNAL(copyrightsChanged(QString)),
                     this,  SIGNAL(copyrightsChanged(QString)));
 
-            connect(m_map.data(), SIGNAL(copyrightsStyleSheetChanged(QString)),
+            connect(m_map, SIGNAL(copyrightsStyleSheetChanged(QString)),
                     copyrights, SLOT(onCopyrightsStyleSheetChanged(QString)));
 
             connect(copyrights, SIGNAL(linkActivated(QString)),
@@ -725,7 +727,7 @@ void QDeclarativeGeoMap::onCameraCapabilitiesChanged(const QGeoCameraCapabilitie
 */
 void QDeclarativeGeoMap::mappingManagerInitialized()
 {
-    m_map = QPointer<QGeoMap>(m_mappingManager->createMap(this));
+    m_map = m_mappingManager->createMap(this);
 
     if (!m_map)
         return;
@@ -765,11 +767,11 @@ void QDeclarativeGeoMap::mappingManagerInitialized()
     QImage copyrightImage;
     if (!m_initialized && width() > 0 && height() > 0) {
         QMetaObject::Connection copyrightStringCatcherConnection =
-                connect(m_map.data(),
+                connect(m_map,
                         QOverload<const QString &>::of(&QGeoMap::copyrightsChanged),
                         [&copyrightString](const QString &copy){ copyrightString = copy; });
         QMetaObject::Connection copyrightImageCatcherConnection =
-                connect(m_map.data(),
+                connect(m_map,
                         QOverload<const QImage &>::of(&QGeoMap::copyrightsChanged),
                         [&copyrightImage](const QImage &copy){ copyrightImage = copy; });
         m_map->setViewportSize(QSize(width(), height()));
@@ -781,28 +783,28 @@ void QDeclarativeGeoMap::mappingManagerInitialized()
     m_copyrights = new QDeclarativeGeoMapCopyrightNotice(this);
     m_copyrights->onCopyrightsStyleSheetChanged(m_map->copyrightsStyleSheet());
 
-    connect(m_map.data(), SIGNAL(copyrightsChanged(QImage)),
+    connect(m_map, SIGNAL(copyrightsChanged(QImage)),
             m_copyrights.data(), SLOT(copyrightsChanged(QImage)));
-    connect(m_map.data(), SIGNAL(copyrightsChanged(QImage)),
+    connect(m_map, SIGNAL(copyrightsChanged(QImage)),
             this,  SIGNAL(copyrightsChanged(QImage)));
 
-    connect(m_map.data(), SIGNAL(copyrightsChanged(QString)),
+    connect(m_map, SIGNAL(copyrightsChanged(QString)),
             m_copyrights.data(), SLOT(copyrightsChanged(QString)));
-    connect(m_map.data(), SIGNAL(copyrightsChanged(QString)),
+    connect(m_map, SIGNAL(copyrightsChanged(QString)),
             this,  SIGNAL(copyrightsChanged(QString)));
 
     if (!copyrightString.isEmpty())
-        emit m_map.data()->copyrightsChanged(copyrightString);
+        emit m_map->copyrightsChanged(copyrightString);
     else if (!copyrightImage.isNull())
-        emit m_map.data()->copyrightsChanged(copyrightImage);
+        emit m_map->copyrightsChanged(copyrightImage);
 
-    connect(m_map.data(), SIGNAL(copyrightsStyleSheetChanged(QString)),
+    connect(m_map, SIGNAL(copyrightsStyleSheetChanged(QString)),
             m_copyrights.data(), SLOT(onCopyrightsStyleSheetChanged(QString)));
 
     connect(m_copyrights.data(), SIGNAL(linkActivated(QString)),
             this, SIGNAL(copyrightLinkActivated(QString)));
-    connect(m_map.data(), &QGeoMap::sgNodeChanged, this, &QQuickItem::update);
-    connect(m_map.data(), &QGeoMap::cameraCapabilitiesChanged, this, &QDeclarativeGeoMap::onCameraCapabilitiesChanged);
+    connect(m_map, &QGeoMap::sgNodeChanged, this, &QQuickItem::update);
+    connect(m_map, &QGeoMap::cameraCapabilitiesChanged, this, &QDeclarativeGeoMap::onCameraCapabilitiesChanged);
 
     // set visibility of copyright notice
     m_copyrights->setCopyrightsVisible(m_copyrightsVisible);
diff --git a/src/location/declarativemaps/qdeclarativegeomap_p.h b/src/location/declarativemaps/qdeclarativegeomap_p.h
index f07a2e7f3..e8ff32651 100644
--- a/src/location/declarativemaps/qdeclarativegeomap_p.h
+++ b/src/location/declarativemaps/qdeclarativegeomap_p.h
@@ -252,7 +252,7 @@ private:
     QList<QDeclarativeGeoMapType *> m_supportedMapTypes;
     QList<QDeclarativeGeoMapItemView *> m_mapViews;
     QQuickGeoMapGestureArea *m_gestureArea;
-    QPointer<QGeoMap> m_map;
+    QGeoMap* m_map = nullptr;
     QPointer<QDeclarativeGeoMapCopyrightNotice> m_copyrights;
     QList<QPointer<QDeclarativeGeoMapItemBase> > m_mapItems;
     QList<QPointer<QDeclarativeGeoMapItemGroup> > m_mapItemGroups;
diff --git a/src/location/declarativemaps/qquickgeomapgesturearea.cpp b/src/location/declarativemaps/qquickgeomapgesturearea.cpp
index a40afd682..33a984d6f 100644
--- a/src/location/declarativemaps/qquickgeomapgesturearea.cpp
+++ b/src/location/declarativemaps/qquickgeomapgesturearea.cpp
@@ -508,7 +508,7 @@ QQuickGeoMapGestureArea::QQuickGeoMapGestureArea(QDeclarativeGeoMap *map)
 /*!
     \internal
 */
-void QQuickGeoMapGestureArea::setMap(QPointer<QGeoMap> map)
+void QQuickGeoMapGestureArea::setMap(QGeoMap *map)
 {
     if (m_map || !map)
         return;
diff --git a/src/location/declarativemaps/qquickgeomapgesturearea_p.h b/src/location/declarativemaps/qquickgeomapgesturearea_p.h
index 5daa39cf2..0bc774d33 100644
--- a/src/location/declarativemaps/qquickgeomapgesturearea_p.h
+++ b/src/location/declarativemaps/qquickgeomapgesturearea_p.h
@@ -178,7 +178,7 @@ public:
     void setMaximumZoomLevel(qreal max);
     qreal maximumZoomLevel() const;
 
-    void setMap(QPointer<QGeoMap> map);
+    void setMap(QGeoMap* map);
 
     bool preventStealing() const;
     void setPreventStealing(bool prevent);
@@ -267,7 +267,7 @@ private:
     void updateFlickParameters(const QPointF &pos);
 
 private:
-    QPointer<QGeoMap> m_map;
+    QGeoMap* m_map;
     QDeclarativeGeoMap *m_declarativeMap;
     bool m_enabled;
 
diff --git a/src/location/maps/qgeomappingmanager.cpp b/src/location/maps/qgeomappingmanager.cpp
index cf040bebe..d73050f7d 100644
--- a/src/location/maps/qgeomappingmanager.cpp
+++ b/src/location/maps/qgeomappingmanager.cpp
@@ -133,10 +133,8 @@ int QGeoMappingManager::managerVersion() const
 */
 QGeoMap *QGeoMappingManager::createMap(QObject *parent)
 {
-    QGeoMap * map = d_ptr->engine->createMap();
-    if (map)
-        connect(parent, &QObject::destroyed,map, &QGeoMap::deleteLater);
-    return map;
+    Q_UNUSED(parent)
+    return d_ptr->engine->createMap();
 }
 
 QList<QGeoMapType> QGeoMappingManager::supportedMapTypes() const
-- 
GitLab