Browse Source

Fix mem leak in game_controller.cpp

pull/2627/head
Vladimir Olteanu 5 years ago committed by Anders Jenbo
parent
commit
61fac447cf
  1. 18
      Source/controls/devices/game_controller.cpp
  2. 2
      Source/controls/devices/game_controller.h

18
Source/controls/devices/game_controller.cpp

@ -15,7 +15,7 @@ namespace devilution {
// Defined in SourceX/controls/plctrls.cpp // Defined in SourceX/controls/plctrls.cpp
extern bool sgbControllerActive; extern bool sgbControllerActive;
std::vector<GameController> *const GameController::controllers_ = new std::vector<GameController>; std::vector<GameController> GameController::controllers_;
ControllerButton GameController::ToControllerButton(const SDL_Event &event) ControllerButton GameController::ToControllerButton(const SDL_Event &event)
{ {
@ -165,7 +165,7 @@ void GameController::Add(int joystickIndex)
} }
SDL_Joystick *const sdlJoystick = SDL_GameControllerGetJoystick(result.sdl_game_controller_); SDL_Joystick *const sdlJoystick = SDL_GameControllerGetJoystick(result.sdl_game_controller_);
result.instance_id_ = SDL_JoystickInstanceID(sdlJoystick); result.instance_id_ = SDL_JoystickInstanceID(sdlJoystick);
controllers_->push_back(result); controllers_.push_back(result);
const SDL_JoystickGUID guid = SDL_JoystickGetGUID(sdlJoystick); const SDL_JoystickGUID guid = SDL_JoystickGetGUID(sdlJoystick);
SDLUniquePtr<char> mapping { SDL_GameControllerMappingForGUID(guid) }; SDLUniquePtr<char> mapping { SDL_GameControllerMappingForGUID(guid) };
@ -177,12 +177,12 @@ void GameController::Add(int joystickIndex)
void GameController::Remove(SDL_JoystickID instanceId) void GameController::Remove(SDL_JoystickID instanceId)
{ {
Log("Removing game controller with instance id {}", instanceId); Log("Removing game controller with instance id {}", instanceId);
for (std::size_t i = 0; i < controllers_->size(); ++i) { for (std::size_t i = 0; i < controllers_.size(); ++i) {
const GameController &controller = (*controllers_)[i]; const GameController &controller = controllers_[i];
if (controller.instance_id_ != instanceId) if (controller.instance_id_ != instanceId)
continue; continue;
controllers_->erase(controllers_->begin() + i); controllers_.erase(controllers_.begin() + i);
sgbControllerActive = !controllers_->empty(); sgbControllerActive = !controllers_.empty();
return; return;
} }
Log("Game controller not found with instance id: {}", instanceId); Log("Game controller not found with instance id: {}", instanceId);
@ -190,7 +190,7 @@ void GameController::Remove(SDL_JoystickID instanceId)
GameController *GameController::Get(SDL_JoystickID instanceId) GameController *GameController::Get(SDL_JoystickID instanceId)
{ {
for (auto &controller : *controllers_) { for (auto &controller : controllers_) {
if (controller.instance_id_ == instanceId) if (controller.instance_id_ == instanceId)
return &controller; return &controller;
} }
@ -212,12 +212,12 @@ GameController *GameController::Get(const SDL_Event &event)
const std::vector<GameController> &GameController::All() const std::vector<GameController> &GameController::All()
{ {
return *controllers_; return controllers_;
} }
bool GameController::IsPressedOnAnyController(ControllerButton button) bool GameController::IsPressedOnAnyController(ControllerButton button)
{ {
for (auto &controller : *controllers_) for (auto &controller : controllers_)
if (controller.IsPressed(button)) if (controller.IsPressed(button))
return true; return true;
return false; return false;

2
Source/controls/devices/game_controller.h

@ -11,7 +11,7 @@
namespace devilution { namespace devilution {
class GameController { class GameController {
static std::vector<GameController> *const controllers_; static std::vector<GameController> controllers_;
public: public:
static void Add(int joystickIndex); static void Add(int joystickIndex);

Loading…
Cancel
Save