ui: fix memory leak in `MapSettings` (#28701)

pull/28748/head
Dean Lee 2 years ago committed by GitHub
parent 309eccad3a
commit 5a00b42092
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 22
      selfdrive/ui/qt/maps/map_settings.cc
  2. 4
      selfdrive/ui/qt/maps/map_settings.h

@ -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<NavDestination>(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<NavDestination*>();
auto destinations = std::vector<std::unique_ptr<NavDestination>>();
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<NavDestination>(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();
});

@ -1,5 +1,7 @@
#pragma once
#include<memory>
#include <QFrame>
#include <QJsonArray>
#include <QJsonDocument>
@ -37,7 +39,7 @@ private:
Params params;
QString cur_destinations;
QVBoxLayout *destinations_layout;
NavDestination *current_destination;
std::unique_ptr<NavDestination> current_destination;
DestinationWidget *current_widget;
QPixmap close_icon;

Loading…
Cancel
Save