aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorColin Snover2017-11-16 22:31:27 -0600
committerEugene Sandulenko2017-11-18 22:35:12 +0100
commita8b635e4cdac9a42d2c81517576bb970e5f9d06f (patch)
treeb5b26ab20111dec2db51ea2f6e9fb26718262ef2 /engines
parentcef4d7787748fe8f0fae45d2573da4dfd4cc1c85 (diff)
downloadscummvm-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.cpp19
-rw-r--r--engines/fullpipe/statics.h1
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;