diff options
author | Colin Snover | 2017-11-16 22:31:27 -0600 |
---|---|---|
committer | Eugene Sandulenko | 2017-11-18 22:35:12 +0100 |
commit | a8b635e4cdac9a42d2c81517576bb970e5f9d06f (patch) | |
tree | b5b26ab20111dec2db51ea2f6e9fb26718262ef2 /engines | |
parent | cef4d7787748fe8f0fae45d2573da4dfd4cc1c85 (diff) | |
download | scummvm-rg350-a8b635e4cdac9a42d2c81517576bb970e5f9d06f.tar.gz scummvm-rg350-a8b635e4cdac9a42d2c81517576bb970e5f9d06f.tar.bz2 scummvm-rg350-a8b635e4cdac9a42d2c81517576bb970e5f9d06f.zip |
FULLPIPE: Fix leaks of DynamicPhases
I am not entirely sure this is a correct fix for these leaks;
there is still the issue of the last member of _dynamicPhases being
invalidated and not removed sometime before the destruction of
Movement. Also, some of the items in this array are not actually
owned by Movement so deleting them will cause double-frees or
use-after-frees. It may be the case that a second list should be
maintained instead containing only the objects that are created
internally within Movement. Further testing will tell for sure.
Diffstat (limited to 'engines')
-rw-r--r-- | engines/fullpipe/statics.cpp | 19 | ||||
-rw-r--r-- | engines/fullpipe/statics.h | 1 |
2 files changed, 12 insertions, 8 deletions
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index eb28b93f59..524eeff5d9 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -1429,14 +1429,17 @@ Movement::~Movement() { if (!_currMovement) { if (_updateFlag1) { _dynamicPhases[0]->freePixelData(); - _dynamicPhases.remove_at(0); + delete _dynamicPhases.remove_at(0); } // FIXME: At this point, the last entry in _dynamicPhases is invalid - for (uint i = 0; i < _dynamicPhases.size() - 1; i++) - _dynamicPhases[i]->freePixelData(); - - _dynamicPhases.clear(); + for (uint i = 0; i < _dynamicPhases.size() - 1; i++) { + DynamicPhase *phase = _dynamicPhases[i]; + if (phase != _staticsObj1 && phase != _staticsObj2) + delete phase; + else + _dynamicPhases[i]->freePixelData(); + } } } @@ -1844,12 +1847,12 @@ void Movement::removeFirstPhase() { gotoNextFrame(0, 0); if (!_currMovement) { - _dynamicPhases.remove_at(0); + delete _dynamicPhases.remove_at(0); for (uint i = 0; i < _dynamicPhases.size(); i++) { - _framePosOffsets[i].x = _framePosOffsets[i + 1].x; - _framePosOffsets[i].y = _framePosOffsets[i + 1].y; + _framePosOffsets[i] = _framePosOffsets[i + 1]; } + _framePosOffsets.pop_back(); } _currDynamicPhaseIndex--; } diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h index fa893d6118..a30915316d 100644 --- a/engines/fullpipe/statics.h +++ b/engines/fullpipe/statics.h @@ -116,6 +116,7 @@ class Movement : public GameObject { int _field_50; int _counterMax; int _counter; + /** a confusing mix of owned and unowned items */ Common::Array<DynamicPhase *> _dynamicPhases; int _field_78; PointList _framePosOffsets; |