From d19ec5773227a804d5a73f1eb5107a7aec73f57a Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sat, 6 Aug 2011 03:41:02 -0400 Subject: [PATCH] ASYLUM: Fix memory leak in ResourceManager The ResourceManager was never deleting the file data buffers, only removing the entries from the cache. Thanks to digitall for the patch. --- engines/asylum/respack.cpp | 15 +++++++++++++-- engines/asylum/respack.h | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/engines/asylum/respack.cpp b/engines/asylum/respack.cpp index 84a9282799f..a09c596bf1a 100644 --- a/engines/asylum/respack.cpp +++ b/engines/asylum/respack.cpp @@ -31,6 +31,13 @@ namespace Asylum { ResourceManager::ResourceManager() : _cdNumber(-1), _musicPackId(kResourcePackInvalid) { } +ResourceManager::~ResourceManager() { + for (ResourceCache::const_iterator it = _resources.begin(); it != _resources.end(); it++) + delete it->_value; + for (ResourceCache::const_iterator it = _music.begin(); it != _music.end(); it++) + delete it->_value; +} + ResourceEntry *ResourceManager::get(ResourceId id) { ResourcePackId packId = RESOURCE_PACK(id); uint16 index = RESOURCE_INDEX(id); @@ -68,11 +75,15 @@ ResourceEntry *ResourceManager::get(ResourceId id) { } void ResourceManager::unload(ResourcePackId id) { - if (_resources.contains(id)) + if (_resources.contains(id)) { + delete _resources.getVal(id); _resources.erase(id); + } - if (_music.contains(id)) + if (_music.contains(id)) { + delete _music.getVal(id); _music.erase(id); + } } ////////////////////////////////////////////////////////////////////////// diff --git a/engines/asylum/respack.h b/engines/asylum/respack.h index 50b885974b3..5f5156fd312 100644 --- a/engines/asylum/respack.h +++ b/engines/asylum/respack.h @@ -72,7 +72,7 @@ private: class ResourceManager { public: ResourceManager(); - virtual ~ResourceManager() {}; + ~ResourceManager(); /** * Get a resource entry