From 63d023964e1523d88463602a7b556e2c8fbe0799 Mon Sep 17 00:00:00 2001 From: David Turner Date: Tue, 9 Nov 2010 11:02:06 +0000 Subject: MOHAWK: Close a number of memory leaks in Myst. These corrections close a number of leaks reported by running Valgrind with --leak-check=full option, but some still remain, mainly in the image loading and caching. svn-id: r54152 --- engines/mohawk/graphics.cpp | 1 + engines/mohawk/myst.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++--- engines/mohawk/myst.h | 9 +++++-- 3 files changed, 69 insertions(+), 5 deletions(-) diff --git a/engines/mohawk/graphics.cpp b/engines/mohawk/graphics.cpp index f472a9d721..a2fb8e3f0c 100644 --- a/engines/mohawk/graphics.cpp +++ b/engines/mohawk/graphics.cpp @@ -92,6 +92,7 @@ MystGraphics::~MystGraphics() { delete _bmpDecoder; delete _jpegDecoder; delete _pictDecoder; + delete[] _pictureFile.entries; } static const char* picFileNames[] = { diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp index b351f611e3..be0ac1c2e4 100644 --- a/engines/mohawk/myst.cpp +++ b/engines/mohawk/myst.cpp @@ -64,6 +64,14 @@ MohawkEngine_Myst::MohawkEngine_Myst(OSystem *syst, const MohawkGameDescription _needsUpdate = false; _curResource = -1; + _gfx = NULL; + _console = NULL; + _scriptParser = NULL; + _varStore = NULL; + _saveLoad = NULL; + _loadDialog = NULL; + _optionsDialog = NULL; + _cursorHintCount = 0; _cursorHints = NULL; @@ -83,6 +91,8 @@ MohawkEngine_Myst::MohawkEngine_Myst(OSystem *syst, const MohawkGameDescription } MohawkEngine_Myst::~MohawkEngine_Myst() { + DebugMan.clearAllDebugChannels(); + delete _gfx; delete _console; delete _scriptParser; @@ -90,10 +100,17 @@ MohawkEngine_Myst::~MohawkEngine_Myst() { delete _saveLoad; delete _loadDialog; delete _optionsDialog; + + delete[] _cursorHints; + delete[] _view.conditionalImages; delete[] _view.scriptResources; - delete[] _cursorHints; - _resources.clear(); + + while(!_resources.empty()) { + MystResource *temp = _resources.back(); + _resources.pop_back(); + delete temp; + } } // Uses cached data objects in preference to disk access @@ -949,7 +966,11 @@ static MystResource *loadResource(MohawkEngine_Myst *vm, Common::SeekableReadStr } void MohawkEngine_Myst::loadResources() { - _resources.clear(); + while(!_resources.empty()) { + MystResource *temp = _resources.back(); + _resources.pop_back(); + delete temp; + } if (!_view.rlst) { debugC(kDebugResource, "No RLST present"); @@ -1011,6 +1032,9 @@ MystResource::MystResource(MohawkEngine_Myst *vm, Common::SeekableReadStream *rl (_flags & kMystSubimageEnableFlag) != 0); } +MystResource::~MystResource() { +} + void MystResource::handleMouseUp() { if (_dest != 0) _vm->changeToCard(_dest); @@ -1021,6 +1045,7 @@ void MystResource::handleMouseUp() { MystResourceType5::MystResourceType5(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent) : MystResource(vm, rlstStream, parent) { debugC(kDebugResource, "\tResource Type 5 Script:"); + _scripts = NULL; _scriptCount = rlstStream->readUint16LE(); debugC(kDebugResource, "\tOpcode Count: %d", _scriptCount); @@ -1046,6 +1071,12 @@ MystResourceType5::MystResourceType5(MohawkEngine_Myst *vm, Common::SeekableRead } } +MystResourceType5::~MystResourceType5() { + for (uint16 i = 0; i < _scriptCount; i++) + delete[] _scripts[i].values; + delete[] _scripts; +} + void MystResourceType5::handleMouseUp() { _vm->_scriptParser->runScript(_scriptCount, _scripts, this); } @@ -1133,6 +1164,14 @@ MystResourceType7::MystResourceType7(MohawkEngine_Myst *vm, Common::SeekableRead _subResources.push_back(loadResource(vm, rlstStream, this)); } +MystResourceType7::~MystResourceType7() { + while(!_subResources.empty()) { + MystResource *temp = _subResources.back(); + _subResources.pop_back(); + delete temp; + } +} + // TODO: All these functions to switch subresource are very similar. // Find way to share code (function pointer pass?) void MystResourceType7::drawDataToScreen() { @@ -1286,6 +1325,10 @@ MystResourceType8::MystResourceType8(MohawkEngine_Myst *vm, Common::SeekableRead } } +MystResourceType8::~MystResourceType8() { + delete[] _subImages; +} + void MystResourceType8::drawDataToScreen() { // Need to call overidden Type 7 function to ensure // switch section is processed correctly. @@ -1416,6 +1459,11 @@ MystResourceType10::MystResourceType10(MohawkEngine_Myst *vm, Common::SeekableRe warning("TODO: Card contains Type 10 Resource - Function not yet implemented"); } +MystResourceType10::~MystResourceType10() { + for (byte i = 0; i < 4; i++) + delete[] _lists[i].list; +} + void MystResourceType10::handleMouseUp() { // TODO } @@ -1472,6 +1520,11 @@ MystResourceType11::MystResourceType11(MohawkEngine_Myst *vm, Common::SeekableRe warning("TODO: Card contains Type 11 Resource - Function not yet implemented"); } +MystResourceType11::~MystResourceType11() { + for (byte i = 0; i < 3; i++) + delete[] _lists[i].list; +} + void MystResourceType11::handleMouseUp() { // TODO @@ -1557,6 +1610,11 @@ MystResourceType12::MystResourceType12(MohawkEngine_Myst *vm, Common::SeekableRe _doAnimation = false; } +MystResourceType12::~MystResourceType12() { + for (byte i = 0; i < 3; i++) + delete[] _lists[i].list; +} + void MystResourceType12::handleAnimation() { // TODO: Probably not final version. Variable/Type 11 Controlled? if (_doAnimation) { diff --git a/engines/mohawk/myst.h b/engines/mohawk/myst.h index 7486e559bb..a66456e1c8 100644 --- a/engines/mohawk/myst.h +++ b/engines/mohawk/myst.h @@ -157,7 +157,7 @@ struct MystScriptEntry { class MystResource { public: MystResource(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent); - virtual ~MystResource() {} + virtual ~MystResource(); MystResource *_parent; @@ -188,6 +188,7 @@ protected: class MystResourceType5 : public MystResource { public: MystResourceType5(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent); + virtual ~MystResourceType5(); void handleMouseUp(); protected: @@ -218,7 +219,7 @@ private: struct MystResourceType7 : public MystResource { public: MystResourceType7(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent); - virtual ~MystResourceType7() {} + virtual ~MystResourceType7(); virtual void drawDataToScreen(); virtual void handleAnimation(); @@ -237,6 +238,7 @@ protected: class MystResourceType8 : public MystResourceType7 { public: MystResourceType8(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent); + virtual ~MystResourceType8(); void drawDataToScreen(); uint16 getType8Var(); @@ -254,6 +256,7 @@ protected: class MystResourceType10 : public MystResourceType8 { public: MystResourceType10(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent); + virtual ~MystResourceType10(); void handleMouseUp(); protected: @@ -273,6 +276,7 @@ protected: class MystResourceType11 : public MystResourceType8 { public: MystResourceType11(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent); + virtual ~MystResourceType11(); void handleMouseUp(); protected: @@ -292,6 +296,7 @@ protected: class MystResourceType12 : public MystResourceType8 { public: MystResourceType12(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent); + virtual ~MystResourceType12(); void handleAnimation(); void handleMouseUp(); -- cgit v1.2.3