diff options
author | D G Turner | 2014-05-05 11:29:41 +0100 |
---|---|---|
committer | D G Turner | 2014-05-05 11:29:41 +0100 |
commit | f0a0537095e0b309f768de0b44cd20d05376c1d9 (patch) | |
tree | caa952d2a47c438a09a109f44cc7c8d5bd8050c9 /engines | |
parent | 0c9bbbcf88c632311f84e34ccf714cc13fde70fd (diff) | |
download | scummvm-rg350-f0a0537095e0b309f768de0b44cd20d05376c1d9.tar.gz scummvm-rg350-f0a0537095e0b309f768de0b44cd20d05376c1d9.tar.bz2 scummvm-rg350-f0a0537095e0b309f768de0b44cd20d05376c1d9.zip |
NEVERHOOD: Fix memory leak from static data loading.
This is occurring due to duplicate entry ids, which should probably not
be present.
Diffstat (limited to 'engines')
-rw-r--r-- | engines/neverhood/staticdata.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp index 552ea92604..03af44b2a5 100644 --- a/engines/neverhood/staticdata.cpp +++ b/engines/neverhood/staticdata.cpp @@ -28,6 +28,18 @@ StaticData::StaticData() { } StaticData::~StaticData() { + for (Common::HashMap<uint32, HitRectList*>::iterator i = _hitRectLists.begin(); i != _hitRectLists.end(); ++i) + delete i->_value; + for (Common::HashMap<uint32, RectList*>::iterator i = _rectLists.begin(); i != _rectLists.end(); ++i) + delete i->_value; + for (Common::HashMap<uint32, MessageList*>::iterator i = _messageLists.begin(); i != _messageLists.end(); ++i) + delete i->_value; + for (Common::HashMap<uint32, NavigationList*>::iterator i = _navigationLists.begin(); i != _navigationLists.end(); ++i) + delete i->_value; + for (Common::HashMap<uint32, HallOfRecordsInfo*>::iterator i = _hallOfRecordsInfoItems.begin(); i != _hallOfRecordsInfoItems.end(); ++i) + delete i->_value; + for (Common::HashMap<uint32, TrackInfo*>::iterator i = _trackInfoItems.begin(); i != _trackInfoItems.end(); ++i) + delete i->_value; } void StaticData::load(const char *filename) { @@ -69,6 +81,11 @@ void StaticData::load(const char *filename) { messageList->push_back(messageItem); } + if(_messageLists.contains(id)) { + warning("Duplicate id %d in _messageLists - freeing older entry", id); + delete _messageLists[id]; + } + _messageLists[id] = messageList; } @@ -98,6 +115,12 @@ void StaticData::load(const char *filename) { } rectList->push_back(rectItem); } + + if(_rectLists.contains(id)) { + warning("Duplicate id %d in _rectLists - freeing older entry", id); + delete _rectLists[id]; + } + _rectLists[id] = rectList; } @@ -117,6 +140,12 @@ void StaticData::load(const char *filename) { hitRect.type = fd.readUint16LE(); hitRectList->push_back(hitRect); } + + if(_hitRectLists.contains(id)) { + warning("Duplicate id %d in _hitRectLists - freeing older entry", id); + delete _hitRectLists[id]; + } + _hitRectLists[id] = hitRectList; } @@ -138,6 +167,12 @@ void StaticData::load(const char *filename) { navigationItem.mouseCursorFileHash = fd.readUint32LE(); navigationList->push_back(navigationItem); } + + if(_navigationLists.contains(id)) { + warning("Duplicate id %d in _navigationLists - freeing older entry", id); + delete _navigationLists[id]; + } + _navigationLists[id] = navigationList; } @@ -153,6 +188,12 @@ void StaticData::load(const char *filename) { hallOfRecordsInfo->bgFilename3 = fd.readUint32LE(); hallOfRecordsInfo->xPosIndex = fd.readByte(); hallOfRecordsInfo->count = fd.readByte(); + + if(_hallOfRecordsInfoItems.contains(id)) { + warning("Duplicate id %d in _hallOfRecordsInfoItems - freeing older entry", id); + delete _hallOfRecordsInfoItems[id]; + } + _hallOfRecordsInfoItems[id] = hallOfRecordsInfo; } @@ -172,6 +213,12 @@ void StaticData::load(const char *filename) { trackInfo->mouseCursorFilename = fd.readUint32LE(); trackInfo->which1 = fd.readUint16LE(); trackInfo->which2 = fd.readUint16LE(); + + if(_trackInfoItems.contains(id)) { + warning("Duplicate id %d in _trackInfoItems - freeing older entry", id); + delete _trackInfoItems[id]; + } + _trackInfoItems[id] = trackInfo; } |