From 0b031de2ea60cef6f94ac9c4db3228e7cebfe702 Mon Sep 17 00:00:00 2001 From: Grimdhex <176165533+Grimdhex@users.noreply.github.com> Date: Fri, 1 Nov 2024 13:39:37 +0100 Subject: [PATCH] fix(Core/Movement): fix a small memory leak in RandomMovementGenerator (#20258) * fix(Core/Movement): memory leak and possible crash Co-Authored-By: Ovahlord <18347559+ovahlord@users.noreply.github.com> * . * fix review --------- Co-authored-by: Ovahlord <18347559+ovahlord@users.noreply.github.com> --- .../MovementGenerators/RandomMovementGenerator.cpp | 14 ++++++++------ .../MovementGenerators/RandomMovementGenerator.h | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp index 082d12512..c8e0a2973 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -29,15 +29,14 @@ template RandomMovementGenerator::~RandomMovementGenerator() { } -template<> -RandomMovementGenerator::~RandomMovementGenerator() -{ - delete _pathGenerator; -} +template RandomMovementGenerator::~RandomMovementGenerator(); template<> void RandomMovementGenerator::_setRandomLocation(Creature* creature) { + if (!creature) + return; + if (creature->_moveState != MAP_OBJECT_CELL_MOVE_NONE) return; @@ -135,7 +134,7 @@ void RandomMovementGenerator::_setRandomLocation(Creature* creature) else // ground { if (!_pathGenerator) - _pathGenerator = new PathGenerator(creature); + _pathGenerator = std::make_unique(creature); else _pathGenerator->Clear(); @@ -242,6 +241,8 @@ void RandomMovementGenerator::DoInitialize(Creature* creature) if (!_wanderDistance) _wanderDistance = creature->GetWanderDistance(); + _pathGenerator.reset(); + _nextMoveTime.Reset(creature->GetSpawnId() && creature->GetWanderDistance() == _wanderDistance ? urand(1, 5000) : 0); _wanderDistance = std::max((creature->GetWanderDistance() == _wanderDistance && creature->GetInstanceId() == 0) ? (creature->CanFly() ? MIN_WANDER_DISTANCE_AIR : MIN_WANDER_DISTANCE_GROUND) : 0.0f, _wanderDistance); @@ -280,6 +281,7 @@ bool RandomMovementGenerator::DoUpdate(Creature* creature, const uint3 { _nextMoveTime.Reset(0); // Expire the timer creature->StopMoving(); + _pathGenerator.reset(); return true; } diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h index 221aa81c1..cb88b352e 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h @@ -61,7 +61,7 @@ private: TimeTrackerSmall _nextMoveTime; uint8 _moveCount; float _wanderDistance; - PathGenerator* _pathGenerator; + std::unique_ptr _pathGenerator; std::vector _destinationPoints; std::vector _validPointsVector[RANDOM_POINTS_NUMBER + 1]; uint8 _currentPoint;