Fix boost::containers::stable_vector memory leak in MapWidget by local variable

This commit is contained in:
AdenKoperczak 2025-03-14 12:25:18 -04:00
parent 0fff5f9e4d
commit 61ac1e5612

View file

@ -1,3 +1,4 @@
#include <ranges>
#include <scwx/qt/map/map_widget.hpp> #include <scwx/qt/map/map_widget.hpp>
#include <scwx/qt/gl/gl.hpp> #include <scwx/qt/gl/gl.hpp>
#include <scwx/qt/manager/font_manager.hpp> #include <scwx/qt/manager/font_manager.hpp>
@ -205,7 +206,6 @@ public:
std::vector<MapStyle> customStyles_ { std::vector<MapStyle> customStyles_ {
MapStyle {.name_ {"Custom"}, .url_ {}, .drawBelow_ {}}}; MapStyle {.name_ {"Custom"}, .url_ {}, .drawBelow_ {}}};
QStringList styleLayers_; QStringList styleLayers_;
types::LayerVector customLayers_;
boost::uuids::uuid customStyleUrlChangedCallbackId_ {}; boost::uuids::uuid customStyleUrlChangedCallbackId_ {};
boost::uuids::uuid customStyleDrawBelowChangedCallbackId_ {}; boost::uuids::uuid customStyleDrawBelowChangedCallbackId_ {};
@ -1185,22 +1185,20 @@ void MapWidgetImpl::AddLayers()
layerList_.clear(); layerList_.clear();
genericLayers_.clear(); genericLayers_.clear();
placefileLayers_.clear(); placefileLayers_.clear();
customLayers_.clear();
customLayers_.shrink_to_fit();
// Update custom layer list from model // Update custom layer list from model
customLayers_ = model::LayerModel::Instance()->GetLayers(); types::LayerVector customLayers = model::LayerModel::Instance()->GetLayers();
// Start by drawing layers before any style-defined layers // Start by drawing layers before any style-defined layers
std::string before = styleLayers_.front().toStdString(); std::string before = styleLayers_.front().toStdString();
// Loop through each custom layer in reverse order // Loop through each custom layer in reverse order
for (auto it = customLayers_.crbegin(); it != customLayers_.crend(); ++it) for (const auto & customLayer : std::ranges::reverse_view(customLayers))
{ {
if (it->type_ == types::LayerType::Map) if (customLayer.type_ == types::LayerType::Map)
{ {
// Style-defined map layers // Style-defined map layers
switch (std::get<types::MapLayer>(it->description_)) switch (std::get<types::MapLayer>(customLayer.description_))
{ {
// Subsequent layers are drawn underneath the map symbology layer // Subsequent layers are drawn underneath the map symbology layer
case types::MapLayer::MapUnderlay: case types::MapLayer::MapUnderlay:
@ -1216,10 +1214,10 @@ void MapWidgetImpl::AddLayers()
break; break;
} }
} }
else if (it->displayed_[id_]) else if (customLayer.displayed_[id_])
{ {
// If the layer is displayed for the current map, add it // If the layer is displayed for the current map, add it
AddLayer(it->type_, it->description_, before); AddLayer(customLayer.type_, customLayer.description_, before);
} }
} }
} }