From 0f39a4367535fcd4bfa4c41340d90d7856d086d8 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 15 Jan 2012 18:35:33 +0200 Subject: SCI: Plug loads of memory leaks in the SCI32 graphics code Many thanks to digitall for finding these --- engines/sci/graphics/frameout.cpp | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index e3fac80f7c..b12413ab69 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -61,12 +61,13 @@ GfxFrameout::GfxFrameout(SegManager *segMan, ResourceManager *resMan, GfxCoordAd } GfxFrameout::~GfxFrameout() { + clear(); } void GfxFrameout::clear() { - _screenItems.clear(); + deletePlaneItems(NULL_REG); _planes.clear(); - _planePictures.clear(); + deletePlanePictures(NULL_REG); } void GfxFrameout::kernelAddPlane(reg_t object) { @@ -214,12 +215,15 @@ void GfxFrameout::addPlanePicture(reg_t object, GuiResourceId pictureId, uint16 } void GfxFrameout::deletePlanePictures(reg_t object) { - for (PlanePictureList::iterator it = _planePictures.begin(); it != _planePictures.end(); it++) { - if (it->object == object) { + PlanePictureList::iterator it = _planePictures.begin(); + + while (it != _planePictures.end()) { + if (it->object == object || object.isNull()) { + delete it->pictureCels; delete it->picture; - _planePictures.erase(it); - deletePlanePictures(object); - return; + it = _planePictures.erase(it); + } else { + ++it; } } } @@ -272,17 +276,28 @@ void GfxFrameout::kernelDeleteScreenItem(reg_t object) { } _screenItems.remove(itemEntry); + delete itemEntry; } void GfxFrameout::deletePlaneItems(reg_t planeObject) { FrameoutList::iterator listIterator = _screenItems.begin(); while (listIterator != _screenItems.end()) { - reg_t itemPlane = readSelector(_segMan, (*listIterator)->object, SELECTOR(plane)); - if (planeObject == itemPlane) + bool objectMatches = false; + if (!planeObject.isNull()) { + reg_t itemPlane = readSelector(_segMan, (*listIterator)->object, SELECTOR(plane)); + objectMatches = (planeObject == itemPlane); + } else { + objectMatches = true; + } + + if (objectMatches) { + FrameoutEntry *itemEntry = *listIterator; listIterator = _screenItems.erase(listIterator); - else + delete itemEntry; + } else { ++listIterator; + } } } -- cgit v1.2.3