From 5a00b420923a1fc7563c68642dca9fbb7d7b7fa7 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Fri, 30 Jun 2023 04:37:19 +0800 Subject: [PATCH] ui: fix memory leak in `MapSettings` (#28701) --- selfdrive/ui/qt/maps/map_settings.cc | 22 +++++++++++----------- selfdrive/ui/qt/maps/map_settings.h | 4 +++- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/selfdrive/ui/qt/maps/map_settings.cc b/selfdrive/ui/qt/maps/map_settings.cc index e95244c574..959e095057 100644 --- a/selfdrive/ui/qt/maps/map_settings.cc +++ b/selfdrive/ui/qt/maps/map_settings.cc @@ -130,12 +130,12 @@ void MapSettings::updateCurrentRoute() { qWarning() << "JSON Parse failed on NavDestination" << dest; return; } - auto destination = new NavDestination(doc.object()); + auto destination = std::make_unique(doc.object()); if (current_destination && *destination == *current_destination) return; - current_destination = destination; - current_widget->set(current_destination, true); + current_destination = std::move(destination); + current_widget->set(current_destination.get(), true); } else { - current_destination = nullptr; + current_destination.reset(nullptr); current_widget->unset("", true); } if (isVisible()) refresh(); @@ -149,7 +149,7 @@ void MapSettings::parseResponse(const QString &response, bool success) { void MapSettings::refresh() { bool has_home = false, has_work = false; - auto destinations = std::vector(); + auto destinations = std::vector>(); auto destinations_str = cur_destinations.trimmed(); if (!destinations_str.isEmpty()) { @@ -160,7 +160,7 @@ void MapSettings::refresh() { } for (auto el : doc.array()) { - auto destination = new NavDestination(el.toObject()); + auto destination = std::make_unique(el.toObject()); // add home and work later if they are missing if (destination->isFavorite()) { @@ -170,7 +170,7 @@ void MapSettings::refresh() { // skip current destination if (current_destination && *destination == *current_destination) continue; - destinations.push_back(destination); + destinations.push_back(std::move(destination)); } } @@ -178,7 +178,7 @@ void MapSettings::refresh() { clearLayout(destinations_layout); // Sort: HOME, WORK, and then descending-alphabetical FAVORITES, RECENTS - std::sort(destinations.begin(), destinations.end(), [](const NavDestination *a, const NavDestination *b) { + std::sort(destinations.begin(), destinations.end(), [](const auto &a, const auto &b) { if (a->isFavorite() && b->isFavorite()) { if (a->label() == NAV_FAVORITE_LABEL_HOME) return true; else if (b->label() == NAV_FAVORITE_LABEL_HOME) return false; @@ -191,11 +191,11 @@ void MapSettings::refresh() { return a->name() < b->name(); }); - for (auto destination : destinations) { + for (auto &destination : destinations) { auto widget = new DestinationWidget(this); - widget->set(destination, false); + widget->set(destination.get(), false); - QObject::connect(widget, &QPushButton::clicked, [=]() { + QObject::connect(widget, &QPushButton::clicked, [&]() { navigateTo(destination->toJson()); emit closeSettings(); }); diff --git a/selfdrive/ui/qt/maps/map_settings.h b/selfdrive/ui/qt/maps/map_settings.h index 38c021036c..4dfe347760 100644 --- a/selfdrive/ui/qt/maps/map_settings.h +++ b/selfdrive/ui/qt/maps/map_settings.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #include #include @@ -37,7 +39,7 @@ private: Params params; QString cur_destinations; QVBoxLayout *destinations_layout; - NavDestination *current_destination; + std::unique_ptr current_destination; DestinationWidget *current_widget; QPixmap close_icon;