From 52b8911e0e9c89fe99b497436d3f48118cb7777a Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Tue, 9 Dec 2025 21:08:56 +0200 Subject: [PATCH] Fix pure virtual function call v2 (#3996) --- src/mbgl/tile/vector_mlt_tile.cpp | 3 +++ src/mbgl/tile/vector_mlt_tile.hpp | 2 +- src/mbgl/tile/vector_mvt_tile.cpp | 3 +++ src/mbgl/tile/vector_mvt_tile.hpp | 2 +- src/mbgl/tile/vector_tile.cpp | 12 ++++-------- src/mbgl/tile/vector_tile.hpp | 6 ++++-- 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/mbgl/tile/vector_mlt_tile.cpp b/src/mbgl/tile/vector_mlt_tile.cpp index a288c57e3..0df2136bb 100644 --- a/src/mbgl/tile/vector_mlt_tile.cpp +++ b/src/mbgl/tile/vector_mlt_tile.cpp @@ -16,6 +16,9 @@ VectorMLTTile::VectorMLTTile(const OverscaledTileID& id_, : VectorTile(id_, std::move(sourceID_), parameters_, tileset_, observer_) {} VectorMLTTile::~VectorMLTTile() { + // this needs to be explicitly deleted in the most-derived destructor + loader.reset(); + // 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(); diff --git a/src/mbgl/tile/vector_mlt_tile.hpp b/src/mbgl/tile/vector_mlt_tile.hpp index 959f9c24a..e4a8fa9dd 100644 --- a/src/mbgl/tile/vector_mlt_tile.hpp +++ b/src/mbgl/tile/vector_mlt_tile.hpp @@ -9,7 +9,7 @@ namespace mbgl { class Tileset; class TileParameters; -class VectorMLTTile : public VectorTile { +class VectorMLTTile final : public VectorTile { public: VectorMLTTile(const OverscaledTileID&, std::string sourceID, diff --git a/src/mbgl/tile/vector_mvt_tile.cpp b/src/mbgl/tile/vector_mvt_tile.cpp index eb01ce40e..1a8e64259 100644 --- a/src/mbgl/tile/vector_mvt_tile.cpp +++ b/src/mbgl/tile/vector_mvt_tile.cpp @@ -16,6 +16,9 @@ VectorMVTTile::VectorMVTTile(const OverscaledTileID& id_, : VectorTile(id_, std::move(sourceID_), parameters_, tileset_, observer_) {} VectorMVTTile::~VectorMVTTile() { + // this needs to be explicitly deleted in the most-derived destructor + loader.reset(); + // 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(); diff --git a/src/mbgl/tile/vector_mvt_tile.hpp b/src/mbgl/tile/vector_mvt_tile.hpp index d43c6bc26..fedf1f5b8 100644 --- a/src/mbgl/tile/vector_mvt_tile.hpp +++ b/src/mbgl/tile/vector_mvt_tile.hpp @@ -9,7 +9,7 @@ namespace mbgl { class Tileset; class TileParameters; -class VectorMVTTile : public VectorTile { +class VectorMVTTile final : public VectorTile { public: VectorMVTTile(const OverscaledTileID&, std::string sourceID, diff --git a/src/mbgl/tile/vector_tile.cpp b/src/mbgl/tile/vector_tile.cpp index 01c5d5ba4..90c14d6e4 100644 --- a/src/mbgl/tile/vector_tile.cpp +++ b/src/mbgl/tile/vector_tile.cpp @@ -13,20 +13,16 @@ VectorTile::VectorTile(const OverscaledTileID& id_, const Tileset& tileset, TileObserver* observer_) : GeometryTile(id_, std::move(sourceID_), parameters_, observer_), - loader(*this, id_, parameters_, tileset) {} + loader(std::make_unique>(*this, id_, parameters_, tileset)) {} -VectorTile::~VectorTile() { - // 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(); -} +VectorTile::~VectorTile() {} void VectorTile::setNecessity(TileNecessity necessity) { - loader.setNecessity(necessity); + loader->setNecessity(necessity); } void VectorTile::setUpdateParameters(const TileUpdateParameters& params) { - loader.setUpdateParameters(params); + loader->setUpdateParameters(params); } void VectorTile::setMetadata(std::optional modified_, std::optional expires_) { diff --git a/src/mbgl/tile/vector_tile.hpp b/src/mbgl/tile/vector_tile.hpp index 0364c52c8..cd9188e23 100644 --- a/src/mbgl/tile/vector_tile.hpp +++ b/src/mbgl/tile/vector_tile.hpp @@ -23,8 +23,10 @@ public: virtual void setData(const std::shared_ptr&) = 0; -private: - TileLoader loader; +protected: + // this needs to be explicitly deleted in the most-derived destructor + // see `~VectorMVTTile` + std::unique_ptr> loader; }; } // namespace mbgl