From 2a80c8066c613ea0eb75e9309e2981f3770102f1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 19 Dec 2015 12:42:22 +0200 Subject: LAB: Plug all the remaining resource-related memory leaks --- engines/lab/resource.cpp | 71 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 17 deletions(-) (limited to 'engines/lab/resource.cpp') diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp index 39b30238de..b673072482 100644 --- a/engines/lab/resource.cpp +++ b/engines/lab/resource.cpp @@ -158,22 +158,10 @@ bool Resource::readViews(uint16 roomNum) { } void Resource::freeViews(uint16 roomNum) { - for (uint16 i = 0; i < 4; i++) { - delete _vm->_rooms[roomNum]._view[i]; - _vm->_rooms[roomNum]._view[i] = nullptr; - } - - if (_vm->_rooms[roomNum]._rules) { - for (RuleList::iterator rule = _vm->_rooms[roomNum]._rules->begin(); rule != _vm->_rooms[roomNum]._rules->end(); ++rule) { - delete (*rule)->_actionList; - delete[](*rule)->_condition; - delete *rule; - *rule = nullptr; - } + for (uint16 i = 0; i < 4; i++) + freeView(_vm->_rooms[roomNum]._view[i]); - delete _vm->_rooms[roomNum]._rules; - _vm->_rooms[roomNum]._rules = nullptr; - } + freeRule(_vm->_rooms[roomNum]._rules); } Common::String Resource::translateFileName(Common::String filename) { @@ -286,6 +274,21 @@ RuleList *Resource::readRule(Common::File *file) { return rules; } +void Resource::freeRule(RuleList *ruleList) { + if (!ruleList) + return; + + for (RuleList::iterator rule = ruleList->begin(); rule != ruleList->end(); ++rule) { + freeAction((*rule)->_actionList); + delete[](*rule)->_condition; + delete *rule; + *rule = nullptr; + } + + delete ruleList; + ruleList = nullptr; +} + Action *Resource::readAction(Common::File *file) { char c; Action *action = nullptr; @@ -312,7 +315,7 @@ Action *Resource::readAction(Common::File *file) { for (int i = 0; i < action->_param1; i++) { tmp = readString(file); - messages[i] = (char *)malloc(tmp.size()); // FIXME: memory leak! + messages[i] = (char *)malloc(tmp.size()); memcpy(messages[i], tmp.c_str(), tmp.size()); } @@ -320,7 +323,7 @@ Action *Resource::readAction(Common::File *file) { } else { Common::String tmp; tmp = readString(file); - action->_data = (byte *)malloc(tmp.size()); // FIXME: memory leak! + action->_data = (byte *)malloc(tmp.size()); memcpy(action->_data, tmp.c_str(), tmp.size()); } @@ -332,6 +335,21 @@ Action *Resource::readAction(Common::File *file) { return head; } +void Resource::freeAction(Action *action) { + while (action) { + Action *nextAction = action->_nextAction; + if (action->_actionType == SHOWMESSAGES) { + char **messages = (char **)action->_data; + for (int i = 0; i < action->_param1; i++) + free(messages[i]); + free(messages); + } else + free(action->_data); + delete action; + action = nextAction; + } +} + CloseData *Resource::readCloseUps(uint16 depth, Common::File *file) { char c; CloseData *closeup = nullptr; @@ -364,6 +382,15 @@ CloseData *Resource::readCloseUps(uint16 depth, Common::File *file) { return head; } +void Resource::freeCloseUps(CloseData *closeUps) { + while (closeUps) { + CloseData *nextCloseUp = closeUps->_nextCloseUp; + freeCloseUps(closeUps->_subCloseUps); + delete closeUps; + closeUps = nextCloseUp; + } +} + ViewData *Resource::readView(Common::File *file) { char c; ViewData *view = nullptr; @@ -390,4 +417,14 @@ ViewData *Resource::readView(Common::File *file) { return head; } +void Resource::freeView(ViewData *view) { + while (view) { + ViewData *nextView = view->_nextCondition; + delete[] view->_condition; + freeCloseUps(view->_closeUps); + delete view; + view = nextView; + } +} + } // End of namespace Lab -- cgit v1.2.3