Skip to content

Commit 52b8911

Browse files
Fix pure virtual function call v2 (#3996)
1 parent a1f3370 commit 52b8911

6 files changed

Lines changed: 16 additions & 12 deletions

File tree

src/mbgl/tile/vector_mlt_tile.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ VectorMLTTile::VectorMLTTile(const OverscaledTileID& id_,
1616
: VectorTile(id_, std::move(sourceID_), parameters_, tileset_, observer_) {}
1717

1818
VectorMLTTile::~VectorMLTTile() {
19+
// this needs to be explicitly deleted in the most-derived destructor
20+
loader.reset();
21+
1922
// Don't rely on `~TileLoader` to close, it's not safe to call there.
2023
// We're still calling a virtual method from a destructor, so any overrides will not be called.
2124
GeometryTile::cancel();

src/mbgl/tile/vector_mlt_tile.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace mbgl {
99
class Tileset;
1010
class TileParameters;
1111

12-
class VectorMLTTile : public VectorTile {
12+
class VectorMLTTile final : public VectorTile {
1313
public:
1414
VectorMLTTile(const OverscaledTileID&,
1515
std::string sourceID,

src/mbgl/tile/vector_mvt_tile.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ VectorMVTTile::VectorMVTTile(const OverscaledTileID& id_,
1616
: VectorTile(id_, std::move(sourceID_), parameters_, tileset_, observer_) {}
1717

1818
VectorMVTTile::~VectorMVTTile() {
19+
// this needs to be explicitly deleted in the most-derived destructor
20+
loader.reset();
21+
1922
// Don't rely on `~TileLoader` to close, it's not safe to call there.
2023
// We're still calling a virtual method from a destructor, so any overrides will not be called.
2124
GeometryTile::cancel();

src/mbgl/tile/vector_mvt_tile.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace mbgl {
99
class Tileset;
1010
class TileParameters;
1111

12-
class VectorMVTTile : public VectorTile {
12+
class VectorMVTTile final : public VectorTile {
1313
public:
1414
VectorMVTTile(const OverscaledTileID&,
1515
std::string sourceID,

src/mbgl/tile/vector_tile.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,16 @@ VectorTile::VectorTile(const OverscaledTileID& id_,
1313
const Tileset& tileset,
1414
TileObserver* observer_)
1515
: GeometryTile(id_, std::move(sourceID_), parameters_, observer_),
16-
loader(*this, id_, parameters_, tileset) {}
16+
loader(std::make_unique<TileLoader<VectorTile>>(*this, id_, parameters_, tileset)) {}
1717

18-
VectorTile::~VectorTile() {
19-
// Don't rely on `~TileLoader` to close, it's not safe to call there.
20-
// We're still calling a virtual method from a destructor, so any overrides will not be called.
21-
GeometryTile::cancel();
22-
}
18+
VectorTile::~VectorTile() {}
2319

2420
void VectorTile::setNecessity(TileNecessity necessity) {
25-
loader.setNecessity(necessity);
21+
loader->setNecessity(necessity);
2622
}
2723

2824
void VectorTile::setUpdateParameters(const TileUpdateParameters& params) {
29-
loader.setUpdateParameters(params);
25+
loader->setUpdateParameters(params);
3026
}
3127

3228
void VectorTile::setMetadata(std::optional<Timestamp> modified_, std::optional<Timestamp> expires_) {

src/mbgl/tile/vector_tile.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ class VectorTile : public GeometryTile {
2323

2424
virtual void setData(const std::shared_ptr<const std::string>&) = 0;
2525

26-
private:
27-
TileLoader<VectorTile> loader;
26+
protected:
27+
// this needs to be explicitly deleted in the most-derived destructor
28+
// see `~VectorMVTTile`
29+
std::unique_ptr<TileLoader<VectorTile>> loader;
2830
};
2931

3032
} // namespace mbgl

0 commit comments

Comments
 (0)