Browse Source

Nullkiller: stabilization, fix memory leaks

Andrii Danylchenko 4 years ago
parent
commit
45942cfbbe

+ 1 - 0
AI/Nullkiller/Engine/Nullkiller.cpp

@@ -118,6 +118,7 @@ void Nullkiller::updateAiState(int pass)
 	activeHero = nullptr;
 
 	memory->removeInvisibleObjects(cb.get());
+
 	dangerHitMap->updateHitMap();
 
 	boost::this_thread::interruption_point();

+ 11 - 2
AI/Nullkiller/Pathfinding/Actors.cpp

@@ -88,7 +88,7 @@ std::string ObjectActor::toString() const
 HeroActor::HeroActor(const CGHeroInstance * hero, HeroRole heroRole, uint64_t chainMask, const Nullkiller * ai)
 	:ChainActor(hero, heroRole, chainMask)
 {
-	exchangeMap = new HeroExchangeMap(this, ai);
+	exchangeMap.reset(new HeroExchangeMap(this, ai));
 	setupSpecialActors();
 }
 
@@ -99,7 +99,7 @@ HeroActor::HeroActor(
 	const Nullkiller * ai)
 	:ChainActor(carrier, other,	army)
 {
-	exchangeMap = new HeroExchangeMap(this, ai);
+	exchangeMap.reset(new HeroExchangeMap(this, ai));
 	armyCost += army->armyCost;
 	actorAction = army->getActorAction();
 	setupSpecialActors();
@@ -244,6 +244,11 @@ ChainActor * HeroActor::exchange(const ChainActor * specialActor, const ChainAct
 	return &result->specialActors[index];
 }
 
+HeroExchangeMap::HeroExchangeMap(const HeroActor * actor, const Nullkiller * ai)
+	:actor(actor), ai(ai)
+{
+}
+
 HeroExchangeMap::~HeroExchangeMap()
 {
 	for(auto & exchange : exchangeMap)
@@ -339,7 +344,11 @@ HeroExchangeArmy * HeroExchangeMap::tryUpgrade(
 	}
 
 	if(target->getArmyStrength() <= army->getArmyStrength())
+	{
+		delete target;
+
 		return nullptr;
+	}
 
 	return target;
 }

+ 2 - 6
AI/Nullkiller/Pathfinding/Actors.h

@@ -84,11 +84,7 @@ private:
 	const Nullkiller * ai;
 
 public:
-	HeroExchangeMap(const HeroActor * actor, const Nullkiller * ai)
-		:actor(actor), ai(ai)
-	{
-	}
-
+	HeroExchangeMap(const HeroActor * actor, const Nullkiller * ai);
 	~HeroExchangeMap();
 
 	HeroActor * exchange(const ChainActor * other);
@@ -106,7 +102,7 @@ public:
 
 private:
 	ChainActor specialActors[SPECIAL_ACTORS_COUNT];
-	HeroExchangeMap * exchangeMap;
+	std::unique_ptr<HeroExchangeMap> exchangeMap;
 
 	void setupSpecialActors();