Fix pure virtual function call v2 (#3996)

This commit is contained in:
Adrian Cojocaru
2025-12-09 21:08:56 +02:00
committed by GitHub
parent a1f3370704
commit 52b8911e0e
6 changed files with 16 additions and 12 deletions

View File

@@ -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();

View File

@@ -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,

View File

@@ -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();

View File

@@ -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,

View File

@@ -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<TileLoader<VectorTile>>(*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<Timestamp> modified_, std::optional<Timestamp> expires_) {

View File

@@ -23,8 +23,10 @@ public:
virtual void setData(const std::shared_ptr<const std::string>&) = 0;
private:
TileLoader<VectorTile> loader;
protected:
// this needs to be explicitly deleted in the most-derived destructor
// see `~VectorMVTTile`
std::unique_ptr<TileLoader<VectorTile>> loader;
};
} // namespace mbgl