aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorD G Turner2014-05-05 11:29:41 +0100
committerD G Turner2014-05-05 11:29:41 +0100
commitf0a0537095e0b309f768de0b44cd20d05376c1d9 (patch)
treecaa952d2a47c438a09a109f44cc7c8d5bd8050c9 /engines
parent0c9bbbcf88c632311f84e34ccf714cc13fde70fd (diff)
downloadscummvm-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.cpp47
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;
}