diff options
author | Arnaud Boutonné | 2010-11-09 20:26:12 +0000 |
---|---|---|
committer | Arnaud Boutonné | 2010-11-09 20:26:12 +0000 |
commit | d002800b52fb1d9325520a8b95510b974f6139b7 (patch) | |
tree | e85670278aee4519280c4f8d182801faf4275903 /engines/hugo/hugo.cpp | |
parent | 1a85ce8e036a292b3d2569d8044b787e76ce48f9 (diff) | |
download | scummvm-rg350-d002800b52fb1d9325520a8b95510b974f6139b7.tar.gz scummvm-rg350-d002800b52fb1d9325520a8b95510b974f6139b7.tar.bz2 scummvm-rg350-d002800b52fb1d9325520a8b95510b974f6139b7.zip |
HUGO: Fix several memory leaks
svn-id: r54168
Diffstat (limited to 'engines/hugo/hugo.cpp')
-rw-r--r-- | engines/hugo/hugo.cpp | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp index ef3352829d..445a8d7b25 100644 --- a/engines/hugo/hugo.cpp +++ b/engines/hugo/hugo.cpp @@ -83,8 +83,8 @@ HugoEngine::HugoEngine(OSystem *syst, const HugoGameDescription *gd) : Engine(sy } HugoEngine::~HugoEngine() { - free(_textData); - free(_stringtData); + freeTexts(_textData); + freeTexts(_stringtData); if (_arrayNouns) { for (int i = 0; _arrayNouns[i]; i++) @@ -98,17 +98,23 @@ HugoEngine::~HugoEngine() { free(_arrayVerbs); } - free(_screenNames); + freeTexts(_screenNames); _screen->freePalette(); - free(_textEngine); - free(_textIntro); + freeTexts(_textEngine); + freeTexts(_textIntro); free(_introX); free(_introY); - free(_textMouse); - free(_textParser); - free(_textSchedule); - free(_textUtil); - free(_arrayReqs); + freeTexts(_textMouse); + freeTexts(_textParser); + freeTexts(_textSchedule); + freeTexts(_textUtil); + + if (_arrayReqs) { + for (int i = 0; _arrayReqs[i] != 0; i++) + free(_arrayReqs[i]); + free(_arrayReqs); + } + free(_hotspots); free(_invent); @@ -751,6 +757,7 @@ char **HugoEngine::loadTextsVariante(Common::File &in, uint16 *arraySize) { int len; char **res = 0; char *pos = 0; + char *posBck = 0; for (int varnt = 0; varnt < _numVariant; varnt++) { numTexts = in.readUint16BE(); @@ -765,6 +772,7 @@ char **HugoEngine::loadTextsVariante(Common::File &in, uint16 *arraySize) { res[0] += DATAALIGNMENT; } else { in.read(pos, entryLen); + posBck = pos; } pos += DATAALIGNMENT; @@ -778,6 +786,9 @@ char **HugoEngine::loadTextsVariante(Common::File &in, uint16 *arraySize) { if (varnt == _gameVariant) res[i] = pos; } + + if (varnt != _gameVariant) + free(posBck); } return res; @@ -822,6 +833,7 @@ char ***HugoEngine::loadTextsArray(Common::File &in) { int numTexts = in.readUint16BE(); int entryLen = in.readUint16BE(); char *pos = (char *)malloc(entryLen); + char *posBck = 0; char **res = 0; if (varnt == _gameVariant) { res = (char **)malloc(sizeof(char *) * numTexts); @@ -830,6 +842,7 @@ char ***HugoEngine::loadTextsArray(Common::File &in) { res[0] += DATAALIGNMENT; } else { in.read(pos, entryLen); + posBck = pos; } pos += DATAALIGNMENT; @@ -845,6 +858,8 @@ char ***HugoEngine::loadTextsArray(Common::File &in) { if (varnt == _gameVariant) resArray[i] = res; + else + free(posBck); } } @@ -876,7 +891,7 @@ void HugoEngine::freeTexts(char **ptr) { if (!ptr) return; - free(*ptr); + free(*ptr - DATAALIGNMENT); free(ptr); } |