diff options
author | Sylvain Dupont | 2010-11-13 02:44:34 +0000 |
---|---|---|
committer | Sylvain Dupont | 2010-11-13 02:44:34 +0000 |
commit | a373bd4a5385dd251298ad41ca1701bec2331197 (patch) | |
tree | a01284eb1a796251c1cbb12a876f9b09fb308c90 /engines/toon/toon.cpp | |
parent | 420c2c9ff2087ce8878dacc4bdb0df3d67e89e34 (diff) | |
download | scummvm-rg350-a373bd4a5385dd251298ad41ca1701bec2331197.tar.gz scummvm-rg350-a373bd4a5385dd251298ad41ca1701bec2331197.tar.bz2 scummvm-rg350-a373bd4a5385dd251298ad41ca1701bec2331197.zip |
TOON: Fix more memory leaks
Mainly leaks in audio and animations
svn-id: r54223
Diffstat (limited to 'engines/toon/toon.cpp')
-rw-r--r-- | engines/toon/toon.cpp | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp index 37b4f242d8..e91a895fd3 100644 --- a/engines/toon/toon.cpp +++ b/engines/toon/toon.cpp @@ -829,8 +829,12 @@ ToonEngine::~ToonEngine() { delete _resources; delete _animationManager; delete _moviePlayer; - delete _mainSurface; + if(_mainSurface) { + _mainSurface->free(); + delete _mainSurface; + } + delete[] _finalPalette; delete[] _backupPalette; delete[] _additionalPalette1; @@ -859,6 +863,20 @@ ToonEngine::~ToonEngine() { delete _pathFinding; + + for (int32 i = 0; i < 64; i++) { + if (_sceneAnimations[i]._active) { + // see if one character shares this instance + for (int32 c = 0; c < 32; c++) { + if (_characters[c] && _characters[c]->getAnimationInstance() == _sceneAnimations[i]._animInstance) { + _characters[c]->setAnimationInstance(0); + } + } + delete _sceneAnimations[i]._originalAnimInstance; + delete _sceneAnimations[i]._animation; + } + } + for (int32 i = 0; i < 32; i++) delete _characters[i]; @@ -869,6 +887,7 @@ ToonEngine::~ToonEngine() { delete _inventoryIconSlots; //delete _genericTexts; delete _audioManager; + delete _gameState; unloadToonDat(); @@ -1642,8 +1661,18 @@ void ToonEngine::exitScene() { delete _sceneAnimations[i]._animation; _sceneAnimations[i]._active = false; _animationManager->removeInstance(_sceneAnimations[i]._animInstance); - _sceneAnimations[i]._animInstance = 0; - _sceneAnimations[i]._animation = 0; + + // see if one character shares this instance + for (int32 c = 0; c < 32; c++) { + if (_characters[c] && _characters[c]->getAnimationInstance() == _sceneAnimations[i]._animInstance) { + _characters[c]->setAnimationInstance(NULL); + } + } + + delete _sceneAnimations[i]._originalAnimInstance; + _sceneAnimations[i]._animInstance = NULL; + _sceneAnimations[i]._animation = NULL; + _sceneAnimations[i]._originalAnimInstance = NULL; } } for (int32 i = 0; i < 64; i++) { @@ -4557,6 +4586,8 @@ char **ToonEngine::loadTextsVariants(Common::File &in) { res[0] += DATAALIGNMENT; } else { in.read(pos, entryLen); + free(pos); + continue; } pos += DATAALIGNMENT; @@ -4637,6 +4668,7 @@ void SceneAnimation::load(ToonEngine *vm, Common::ReadStream *stream) { _animInstance = vm->getAnimationManager()->createNewInstance(kAnimationScene); _animInstance->load(stream); vm->getAnimationManager()->addInstance(_animInstance); + _originalAnimInstance = _animInstance; } // load animation if any |