From b06e2b308cd739c09b22daebcce9bb69217728e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 8 Apr 2026 10:36:58 -0600 Subject: [PATCH] Fix memory leak in achievements screen --- UI/RetroAchievementScreens.cpp | 23 ++++++++++++++--------- UI/RetroAchievementScreens.h | 5 ++++- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/UI/RetroAchievementScreens.cpp b/UI/RetroAchievementScreens.cpp index 3e60e9c59e..3e6d519c03 100644 --- a/UI/RetroAchievementScreens.cpp +++ b/UI/RetroAchievementScreens.cpp @@ -100,9 +100,6 @@ void CreateAchievementsTab(UI::ViewGroup *achievements, const SubsetInfo &subset const rc_client_game_t *client_game = rc_client_get_game_info(Achievements::GetClient()); - rc_client_achievement_list_t *list = rc_client_create_achievement_list(Achievements::GetClient(), - GetListFilter(), RC_CLIENT_ACHIEVEMENT_LIST_GROUPING_PROGRESS); - if (!subset.isDefault) { achievements->Add(new Spacer(8.0f)); achievements->Add(new TextView(subset.title))->SetTextSize(UI::TextSize::Big); @@ -128,8 +125,18 @@ void CreateAchievementsTab(UI::ViewGroup *achievements, const SubsetInfo &subset section->Add(new AchievementView(bucket.achievements[j])); } } +} - rc_client_destroy_achievement_list(list); +RetroAchievementsListScreen::RetroAchievementsListScreen(const Path &gamePath) : UITabbedBaseDialogScreen(gamePath) { + list_ = rc_client_create_achievement_list(Achievements::GetClient(), + GetListFilter(), RC_CLIENT_ACHIEVEMENT_LIST_GROUPING_PROGRESS); +} + +RetroAchievementsListScreen::~RetroAchievementsListScreen() { + if (list_) { + rc_client_destroy_achievement_list(list_); + list_ = nullptr; + } } void RetroAchievementsListScreen::CreateLeaderboardsTab(UI::ViewGroup *viewGroup) { @@ -158,6 +165,7 @@ void RetroAchievementsListScreen::CreateLeaderboardsTab(UI::ViewGroup *viewGroup screenManager()->push(new RetroAchievementsLeaderboardScreen(gamePath_, leaderboardID)); }); } + rc_client_destroy_leaderboard_list(list); } void RetroAchievementsListScreen::CreateStatisticsTab(UI::ViewGroup *viewGroup) { @@ -173,14 +181,11 @@ void RetroAchievementsListScreen::CreateStatisticsTab(UI::ViewGroup *viewGroup) void RetroAchievementsListScreen::CreateTabs() { auto ac = GetI18NCategory(I18NCat::ACHIEVEMENTS); - rc_client_achievement_list_t *list = rc_client_create_achievement_list(Achievements::GetClient(), - GetListFilter(), RC_CLIENT_ACHIEVEMENT_LIST_GROUPING_PROGRESS); - std::map bucketsBySubset; const rc_client_game_t *client_game = rc_client_get_game_info(Achievements::GetClient()); - for (uint32_t i = 0; i < list->num_buckets; i++) { - const rc_client_achievement_bucket_t &bucket = list->buckets[i]; + for (uint32_t i = 0; i < list_->num_buckets; i++) { + const rc_client_achievement_bucket_t &bucket = list_->buckets[i]; if (!bucket.num_achievements) { continue; } diff --git a/UI/RetroAchievementScreens.h b/UI/RetroAchievementScreens.h index 86070d740e..3b4b7634fc 100644 --- a/UI/RetroAchievementScreens.h +++ b/UI/RetroAchievementScreens.h @@ -15,7 +15,8 @@ // Lists the achievements and leaderboards for one game. class RetroAchievementsListScreen : public UITabbedBaseDialogScreen { public: - RetroAchievementsListScreen(const Path &gamePath) : UITabbedBaseDialogScreen(gamePath) {} + RetroAchievementsListScreen(const Path &gamePath); + ~RetroAchievementsListScreen(); const char *tag() const override { return "RetroAchievementsListScreen"; } void CreateTabs() override; @@ -26,6 +27,8 @@ protected: private: void CreateLeaderboardsTab(UI::ViewGroup *viewGroup); void CreateStatisticsTab(UI::ViewGroup *viewGroup); + + rc_client_achievement_list_t *list_ = nullptr; }; // Lets you manage your account, and shows some achievement stats and stuff.