[Scummvm-git-logs] scummvm master -> 934567a87c3352c8f1327f072c5fa0f8bc09a324

eriktorbjorn noreply at scummvm.org
Tue Nov 16 12:34:31 UTC 2021


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
934567a87c GUI: Fix grid memory leaks


Commit: 934567a87c3352c8f1327f072c5fa0f8bc09a324
    https://github.com/scummvm/scummvm/commit/934567a87c3352c8f1327f072c5fa0f8bc09a324
Author: Torbjörn Andersson (eriktorbjorn at users.sourceforge.net)
Date: 2021-11-16T13:34:17+01:00

Commit Message:
GUI: Fix grid memory leaks

Clearing a HashMap doesn't delete the objects stored inside it, so do
that explicitly.

Changed paths:
    gui/widgets/grid.cpp
    gui/widgets/grid.h


diff --git a/gui/widgets/grid.cpp b/gui/widgets/grid.cpp
index 02819102f1..d6a7c23135 100644
--- a/gui/widgets/grid.cpp
+++ b/gui/widgets/grid.cpp
@@ -375,15 +375,23 @@ GridWidget::GridWidget(GuiObject *boss, const Common::String &name)
 }
 
 GridWidget::~GridWidget() {
-	_platformIcons.clear();
-	_languageIcons.clear();
-	_loadedSurfaces.clear();
+	unloadSurfaces(_platformIcons);
+	unloadSurfaces(_languageIcons);
+	unloadSurfaces(_loadedSurfaces);
 	_gridItems.clear();
 	_dataEntryList.clear();
 	_sortedEntryList.clear();
 	_visibleEntryList.clear();
 }
 
+template<typename T>
+void GridWidget::unloadSurfaces(Common::HashMap<T, const Graphics::ManagedSurface *> &surfaces) {
+	for (typename Common::HashMap<T, const Graphics::ManagedSurface *>::iterator i = surfaces.begin(); i != surfaces.end(); ++i) {
+		delete i->_value;
+	}
+	surfaces.clear();
+}
+
 const Graphics::ManagedSurface *GridWidget::filenameToSurface(const Common::String &name) {
 	for (Common::Array<GridItemInfo *>::iterator l = _visibleEntryList.begin(); l != _visibleEntryList.end(); ++l) {
 		if ((!(*l)->isHeader) && ((*l)->thumbPath == name)) {
@@ -808,7 +816,7 @@ void GridWidget::reflowLayout() {
 	_thumbnailHeight = g_gui.xmlEval()->getVar("Globals.GridItemThumbnail.Height");
 	_thumbnailWidth = g_gui.xmlEval()->getVar("Globals.GridItemThumbnail.Width");
 	if ((oldThumbnailHeight != _thumbnailHeight) || (oldThumbnailWidth != _thumbnailWidth)) {
-		_loadedSurfaces.clear();
+		unloadSurfaces(_loadedSurfaces);
 		reloadThumbnails();
 		loadFlagIcons();
 	}
diff --git a/gui/widgets/grid.h b/gui/widgets/grid.h
index 8727726921..b3772edecb 100644
--- a/gui/widgets/grid.h
+++ b/gui/widgets/grid.h
@@ -163,6 +163,9 @@ public:
 	GridWidget(GuiObject *boss, const Common::String &name);
 	~GridWidget();
 
+	template<typename T>
+	void unloadSurfaces(Common::HashMap<T, const Graphics::ManagedSurface *> &surfaces);
+
 	const Graphics::ManagedSurface *filenameToSurface(const Common::String &name);
 	const Graphics::ManagedSurface *languageToSurface(Common::Language languageCode);
 	const Graphics::ManagedSurface *platformToSurface(Common::Platform platformCode);




More information about the Scummvm-git-logs mailing list