From b930e57e8b6804314cd960ee3853e5f957b56946 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Fri, 28 Nov 2025 23:09:10 +0200 Subject: [PATCH] Fix pure virtual function call (#3979) --- src/mbgl/tile/vector_mlt_tile.cpp | 6 ++++++ src/mbgl/tile/vector_mlt_tile.hpp | 2 ++ src/mbgl/tile/vector_mvt_tile.cpp | 6 ++++++ src/mbgl/tile/vector_mvt_tile.hpp | 2 ++ 4 files changed, 16 insertions(+) diff --git a/src/mbgl/tile/vector_mlt_tile.cpp b/src/mbgl/tile/vector_mlt_tile.cpp index 60ffd8ec6..a288c57e3 100644 --- a/src/mbgl/tile/vector_mlt_tile.cpp +++ b/src/mbgl/tile/vector_mlt_tile.cpp @@ -15,6 +15,12 @@ VectorMLTTile::VectorMLTTile(const OverscaledTileID& id_, TileObserver* observer_) : VectorTile(id_, std::move(sourceID_), parameters_, tileset_, observer_) {} +VectorMLTTile::~VectorMLTTile() { + // Don't rely on `~TileLoader` to close, it's not safe to call there. + // We're still calling a virtual method from a destructor, so any overrides will not be called. + GeometryTile::cancel(); +} + void VectorMLTTile::setData(const std::shared_ptr& data_) { if (!obsolete) { GeometryTile::setData(data_ ? std::make_unique(data_) : nullptr); diff --git a/src/mbgl/tile/vector_mlt_tile.hpp b/src/mbgl/tile/vector_mlt_tile.hpp index cd3f4b88b..959f9c24a 100644 --- a/src/mbgl/tile/vector_mlt_tile.hpp +++ b/src/mbgl/tile/vector_mlt_tile.hpp @@ -17,6 +17,8 @@ public: const Tileset&, TileObserver* observer = nullptr); + ~VectorMLTTile() override; + void setData(const std::shared_ptr& data) override; }; diff --git a/src/mbgl/tile/vector_mvt_tile.cpp b/src/mbgl/tile/vector_mvt_tile.cpp index b93743bfd..eb01ce40e 100644 --- a/src/mbgl/tile/vector_mvt_tile.cpp +++ b/src/mbgl/tile/vector_mvt_tile.cpp @@ -15,6 +15,12 @@ VectorMVTTile::VectorMVTTile(const OverscaledTileID& id_, TileObserver* observer_) : VectorTile(id_, std::move(sourceID_), parameters_, tileset_, observer_) {} +VectorMVTTile::~VectorMVTTile() { + // Don't rely on `~TileLoader` to close, it's not safe to call there. + // We're still calling a virtual method from a destructor, so any overrides will not be called. + GeometryTile::cancel(); +} + void VectorMVTTile::setData(const std::shared_ptr& data_) { if (!obsolete) { GeometryTile::setData(data_ ? std::make_unique(data_) : nullptr); diff --git a/src/mbgl/tile/vector_mvt_tile.hpp b/src/mbgl/tile/vector_mvt_tile.hpp index 716ba7fcc..d43c6bc26 100644 --- a/src/mbgl/tile/vector_mvt_tile.hpp +++ b/src/mbgl/tile/vector_mvt_tile.hpp @@ -17,6 +17,8 @@ public: const Tileset&, TileObserver* observer = nullptr); + ~VectorMVTTile() override; + void setData(const std::shared_ptr& data) override; };