Skip to content

Commit 1f91291

Browse files
committed
Fix memory leaks
1 parent 9d1491e commit 1f91291

15 files changed

Lines changed: 72 additions & 27 deletions

‎src/Battlescape/BattlescapeGame.cpp‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ BattlescapeGame::BattlescapeGame(SavedBattleGame *save, BattlescapeState *parent
8383
cancelCurrentAction();
8484
_currentAction.targeting = false;
8585
_currentAction.type = BA_NONE;
86-
8786
}
8887

8988

@@ -92,6 +91,14 @@ BattlescapeGame::BattlescapeGame(SavedBattleGame *save, BattlescapeState *parent
9291
*/
9392
BattlescapeGame::~BattlescapeGame()
9493
{
94+
for (std::list<BattleState*>::iterator i = _states.begin(); i != _states.end(); ++i)
95+
{
96+
delete *i;
97+
}
98+
for (std::list<BattleState*>::iterator i = _deleted.begin(); i != _deleted.end(); ++i)
99+
{
100+
delete *i;
101+
}
95102
}
96103

97104
/**
@@ -363,6 +370,12 @@ bool BattlescapeGame::kneel(BattleUnit *bu)
363370
*/
364371
void BattlescapeGame::endTurn()
365372
{
373+
for (std::list<BattleState*>::iterator i = _deleted.begin(); i != _deleted.end(); ++i)
374+
{
375+
delete *i;
376+
}
377+
_deleted.clear();
378+
366379
Position p;
367380

368381
_tuReserved = _playerTUReserved;
@@ -799,6 +812,7 @@ void BattlescapeGame::popState()
799812
_parentState->warning(action.result);
800813
actionFailed = true;
801814
}
815+
_deleted.push_back(_states.front());
802816
_states.pop_front();
803817

804818
// handle the end of this unit's actions

‎src/Battlescape/BattlescapeGame.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class BattlescapeGame
7272
private:
7373
SavedBattleGame *_save;
7474
BattlescapeState *_parentState;
75-
std::list<BattleState*> _states;
75+
std::list<BattleState*> _states, _deleted;
7676
BattleActionType _tuReserved, _playerTUReserved;
7777
bool _playerPanicHandled;
7878
int _AIActionCounter;

‎src/Battlescape/ExplosionBState.cpp‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ void ExplosionBState::init()
119119
p.x += X; p.y += Y;
120120
Explosion *explosion = new Explosion(p, frame, true);
121121
// add the explosion on the map
122-
_parent->getMap()->getExplosions()->insert(explosion);
122+
_parent->getMap()->getExplosions()->push_back(explosion);
123123
if (i > 0 && i % counter == 0)
124124
{
125125
--frame;
@@ -156,7 +156,7 @@ void ExplosionBState::init()
156156
_parent->getResourcePack()->getSound("BATTLE.CAT", sound)->play();
157157
}
158158
Explosion *explosion = new Explosion(_center, anim, false, hit);
159-
_parent->getMap()->getExplosions()->insert(explosion);
159+
_parent->getMap()->getExplosions()->push_back(explosion);
160160
_parent->getMap()->getCamera()->setViewLevel(_center.z / 24);
161161

162162
BattleUnit *target = t->getUnit();
@@ -173,12 +173,13 @@ void ExplosionBState::init()
173173
*/
174174
void ExplosionBState::think()
175175
{
176-
for (std::set<Explosion*>::const_iterator i = _parent->getMap()->getExplosions()->begin(), inext = i; i != _parent->getMap()->getExplosions()->end(); i = inext)
176+
for (std::list<Explosion*>::const_iterator i = _parent->getMap()->getExplosions()->begin(), inext = i; i != _parent->getMap()->getExplosions()->end(); i = inext)
177177
{
178178
++inext;
179179
if(!(*i)->animate())
180180
{
181-
_parent->getMap()->getExplosions()->erase((*i));
181+
delete (*i);
182+
_parent->getMap()->getExplosions()->erase(i);
182183
if (_parent->getMap()->getExplosions()->empty())
183184
{
184185
explode();

‎src/Battlescape/Map.cpp‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ void Map::draw()
182182
_explosionInFOV = _save->getDebugMode();
183183
if (!_explosions.empty())
184184
{
185-
for (std::set<Explosion*>::iterator i = _explosions.begin(); i != _explosions.end(); ++i)
185+
for (std::list<Explosion*>::iterator i = _explosions.begin(); i != _explosions.end(); ++i)
186186
{
187187
t = _save->getTile(Position((*i)->getPosition().x/16, (*i)->getPosition().y/16, (*i)->getPosition().z/24));
188188
if (t && ((*i)->isBig() || t->getVisible()))
@@ -1079,7 +1079,7 @@ void Map::drawTerrain(Surface *surface)
10791079
// check if we got big explosions
10801080
if (_explosionInFOV)
10811081
{
1082-
for (std::set<Explosion*>::const_iterator i = _explosions.begin(); i != _explosions.end(); ++i)
1082+
for (std::list<Explosion*>::const_iterator i = _explosions.begin(); i != _explosions.end(); ++i)
10831083
{
10841084
_camera->convertVoxelToScreen((*i)->getPosition(), &bulletPositionScreen);
10851085
if ((*i)->isBig())
@@ -1447,7 +1447,7 @@ Projectile *Map::getProjectile() const
14471447
* Gets a list of explosion sprites on the map.
14481448
* @return A list of explosion sprites.
14491449
*/
1450-
std::set<Explosion*> *Map::getExplosions()
1450+
std::list<Explosion*> *Map::getExplosions()
14511451
{
14521452
return &_explosions;
14531453
}

‎src/Battlescape/Map.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class Map : public InteractiveSurface
6161
int _animFrame;
6262
Projectile *_projectile;
6363
bool _projectileInFOV;
64-
std::set<Explosion *> _explosions;
64+
std::list<Explosion *> _explosions;
6565
bool _explosionInFOV, _launch;
6666
BattlescapeMessage *_message;
6767
Camera *_camera;
@@ -119,7 +119,7 @@ class Map : public InteractiveSurface
119119
/// Gets projectile.
120120
Projectile *getProjectile() const;
121121
/// Gets explosion set.
122-
std::set<Explosion*> *getExplosions();
122+
std::list<Explosion*> *getExplosions();
123123
/// Gets the pointer to the camera.
124124
Camera *getCamera();
125125
/// Mouse-scrolls the camera.

‎src/Battlescape/ProjectileFlyBState.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ void ProjectileFlyBState::think()
535535
if (_projectileImpact != V_OUTOFBOUNDS)
536536
{
537537
Explosion *explosion = new Explosion(proj->getPosition(1), _ammo->getRules()->getHitAnimation(), false, false);
538-
_parent->getMap()->getExplosions()->insert(explosion);
538+
_parent->getMap()->getExplosions()->push_back(explosion);
539539
_parent->getSave()->getTileEngine()->hit(proj->getPosition(1), _ammo->getRules()->getPower(), _ammo->getRules()->getDamageType(), 0);
540540
}
541541
++i;

‎src/Geoscape/GraphsState.cpp‎

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,20 @@ GraphsState::~GraphsState()
323323
std::string graphRegionToggles = "";
324324
std::string graphCountryToggles = "";
325325
std::string graphFinanceToggles = "";
326-
for (size_t i = 0; i < _regionToggles.size(); ++i) graphRegionToggles.push_back(_regionToggles[i]->_pushed ? '1' : '0');
327-
for (size_t i = 0; i < _countryToggles.size(); ++i) graphCountryToggles.push_back(_countryToggles[i]->_pushed ? '1' : '0');
328-
for (size_t i = 0; i < _financeToggles.size(); ++i) graphFinanceToggles.push_back(_financeToggles[i] ? '1' : '0');
326+
for (size_t i = 0; i < _regionToggles.size(); ++i)
327+
{
328+
graphRegionToggles.push_back(_regionToggles[i]->_pushed ? '1' : '0');
329+
delete _regionToggles[i];
330+
}
331+
for (size_t i = 0; i < _countryToggles.size(); ++i)
332+
{
333+
graphCountryToggles.push_back(_countryToggles[i]->_pushed ? '1' : '0');
334+
delete _countryToggles[i];
335+
}
336+
for (size_t i = 0; i < _financeToggles.size(); ++i)
337+
{
338+
graphFinanceToggles.push_back(_financeToggles[i] ? '1' : '0');
339+
}
329340
_game->getSavedGame()->setGraphRegionToggles(graphRegionToggles);
330341
_game->getSavedGame()->setGraphCountryToggles(graphCountryToggles);
331342
_game->getSavedGame()->setGraphFinanceToggles(graphFinanceToggles);

‎src/Interface/Text.cpp‎

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,7 @@ void Text::initText(Font *big, Font *small, Language *lang)
150150
{
151151
_big = big;
152152
_small = small;
153-
if (lang == 0)
154-
_lang = new Language();
155-
else
156-
_lang = lang;
153+
_lang = lang;
157154
_font = _small;
158155
processText();
159156
}
@@ -349,7 +346,7 @@ int Text::getTextWidth(int line) const
349346
*/
350347
void Text::processText()
351348
{
352-
if (_font == 0)
349+
if (_font == 0 || _lang == 0)
353350
{
354351
return;
355352
}

‎src/Menu/NewBattleState.cpp‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,7 @@ void NewBattleState::btnOkClick(Action *)
481481
_craft->setDestination(t);
482482
bgen.setTerrorSite(t);
483483
bgen.setCraft(_craft);
484+
_game->getSavedGame()->getTerrorSites()->push_back(t);
484485
}
485486
else if (_missionTypes[_cbxMission->getSelected()] == "STR_BASE_DEFENSE")
486487
{
@@ -515,6 +516,7 @@ void NewBattleState::btnOkClick(Action *)
515516
bgame->setMissionType("STR_UFO_GROUND_ASSAULT");
516517
else
517518
bgame->setMissionType("STR_UFO_CRASH_RECOVERY");
519+
_game->getSavedGame()->getUfos()->push_back(u);
518520
}
519521
if (_craft)
520522
_craft->setSpeed(0);

‎src/Menu/StartState.cpp‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ StartState::StartState(Game *game) : State(game), _anim(0)
7070

7171
_font = new Font();
7272
_font->loadTerminal();
73+
_lang = new Language();
7374

7475
_text = new Text(Options::baseXResolution, Options::baseYResolution, 0, 0);
7576
_cursor = new Text(_font->getWidth(), _font->getHeight(), 0, 0);
@@ -81,11 +82,11 @@ StartState::StartState(Game *game) : State(game), _anim(0)
8182
add(_cursor);
8283

8384
// Set up objects
84-
_text->initText(_font, _font, 0);
85+
_text->initText(_font, _font, _lang);
8586
_text->setColor(0);
8687
_text->setWordWrap(true);
8788

88-
_cursor->initText(_font, _font, 0);
89+
_cursor->initText(_font, _font, _lang);
8990
_cursor->setColor(0);
9091
_cursor->setText(L"_");
9192

@@ -118,6 +119,7 @@ StartState::~StartState()
118119
}
119120
delete _font;
120121
delete _timer;
122+
delete _lang;
121123
}
122124

123125
/**

0 commit comments

Comments
 (0)