From a8fa8bf5f29d2a173f2afc66d3db6bb3910356a3 Mon Sep 17 00:00:00 2001 From: Lefucjusz Date: Thu, 30 Nov 2023 15:06:28 +0100 Subject: [PATCH] [MOS-1060] Fix memory leak in contacts list view Fix of the memory leak that happened in contacts list view due to not deleting unused heap-allocated object. --- .../application-phonebook/widgets/PhonebookListView.cpp | 4 ++-- module-gui/gui/widgets/ListItemProvider.hpp | 5 ++--- module-gui/gui/widgets/ListViewEngine.cpp | 7 +++---- pure_changelog.md | 3 ++- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/module-apps/application-phonebook/widgets/PhonebookListView.cpp b/module-apps/application-phonebook/widgets/PhonebookListView.cpp index eddb98fad036f13503817877c136b75b69c169ac..0a50d432f241441fc0b1d01c47b1942d8be6c2c2 100644 --- a/module-apps/application-phonebook/widgets/PhonebookListView.cpp +++ b/module-apps/application-phonebook/widgets/PhonebookListView.cpp @@ -61,7 +61,6 @@ namespace gui ListItem *previousListItem = nullptr; while ((item = provider->getItem(getOrderFromDirection())) != nullptr) { - /* If direction is top-to-bottom, add label mark before adding phonebook item. */ if (direction == listview::Direction::Bottom) { addLabelMarker(dynamic_cast(item)); @@ -73,6 +72,7 @@ namespace gui body->addWidget(item); } else { + delete item; // Item has not been added to any GUI element - delete it manually if (direction == listview::Direction::Top) { if (previousItemIsLabel) { break; @@ -97,7 +97,7 @@ namespace gui recalculateStartIndex(); // Add element on top for first page purpose - if (startIndex == 0 && direction == listview::Direction::Top) { + if ((startIndex == 0) && (direction == listview::Direction::Top)) { body->addWidget(new PhonebookMarkItem(labelMark)); } } diff --git a/module-gui/gui/widgets/ListItemProvider.hpp b/module-gui/gui/widgets/ListItemProvider.hpp index a74a18e2369f75a7122394210f46c63e97d3cc4e..e85b6fd29b015e4aca0536c431791467e2d81c22 100644 --- a/module-gui/gui/widgets/ListItemProvider.hpp +++ b/module-gui/gui/widgets/ListItemProvider.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -28,7 +28,6 @@ namespace gui virtual ListItem *getItem(Order order) = 0; - virtual void requestRecords(uint32_t offset, uint32_t limit) = 0; + virtual void requestRecords(std::uint32_t offset, std::uint32_t limit) = 0; }; - } // namespace gui diff --git a/module-gui/gui/widgets/ListViewEngine.cpp b/module-gui/gui/widgets/ListViewEngine.cpp index 582f4fab53e9e0af88fdf66e63af5e78a89d2fcf..a5d50c9aee076dbb7ed2aa226a41b3a7eaee9f30 100644 --- a/module-gui/gui/widgets/ListViewEngine.cpp +++ b/module-gui/gui/widgets/ListViewEngine.cpp @@ -64,7 +64,7 @@ namespace gui setup(rebuildType, dataOffset); // If deletion operation caused last page to be removed request previous one. - if ((startIndex != 0 && startIndex == elementsCount)) { + if (startIndex != 0 && startIndex == elementsCount) { requestPreviousPage(); } else { @@ -178,9 +178,7 @@ namespace gui body->setFocusItem(nullptr); while (const auto el = body->children.back()) { - if (el->type == ItemType::LIST_ITEM) { - if (!dynamic_cast(el)->deleteByList) { body->removeWidget(el); } @@ -319,7 +317,8 @@ namespace gui if (!item->visible) { // In case model is tracking internal indexes -> undo last get. if (requestFullListRender) { - provider->getItem(getOppositeOrderFromDirection()); + const auto prevItem = provider->getItem(getOppositeOrderFromDirection()); + delete prevItem; // Remove created item to prevent memory leak } break; } diff --git a/pure_changelog.md b/pure_changelog.md index b9940e906e99b291f0e714c0049cc393ef8be1d7..2f57cb400c6f64eea7bae831e7ef5220825d8eb6 100644 --- a/pure_changelog.md +++ b/pure_changelog.md @@ -13,7 +13,8 @@ ### Fixed -* Fixed playback start delay when trying to play MP3 files with large metadata +* Fixed playback start delay when trying to play MP3 files with large metadata. +* Fixed memory leak in contacts list view. ## [1.10.0 2023-11-24]