В игровом контроллере я определил текущее состояние. Для переключения между состояниями я хочу использовать unordered_map с перечислением в качестве ключа и классом состояния в качестве значения. Но как только я записал std::unordered_map _turn_states_map; внутри заголовка, у меня возникли утечки памяти.
Чтобы получить избавившись от этих утечек памяти, я попытался уничтожить их в деконструкторе следующим образом:
Код: Выделить всё
GameController::~GameController()
{
for (std::unordered_map::iterator iterator{ _turn_states_map.begin() }; iterator != _turn_states_map.end(); iterator++) {
iterator->second.reset();
_turn_states_map.erase(iterator);
}
_turn_states_map.clear();
}
Будем благодарны за любую помощь.
Редактирование 1 — минимальный пример
Игровой контроллер будет использоваться для сохранения общего_ptr в текущем состоянии и переключения на следующее.< /p>
Ниже находится заголовок GameController:
Код: Выделить всё
class GameController
{
public:
GameController();
~GameController();
void do_action(Socket& client, Player& player, std::string command);
void set_next_state(TurnStateEnum state);
private:
std::unordered_map _turn_states_map;
std::shared_ptr _turn_state;
void initialize_turn_states_map();
};
Код: Выделить всё
GameController::GameController()
{
initialize_turn_states_map();
_turn_state = _turn_states_map.at(TurnStateEnum::SETUP);
}
GameController::~GameController()
{
for (std::unordered_map::iterator iterator{ _turn_states_map.begin() }; iterator != _turn_states_map.end(); iterator++) {
iterator->second.reset();
_turn_states_map.erase(iterator);
}
_turn_states_map.clear();
}
void GameController::do_action(Socket& client, Player& player, std::string command)
{
_turn_state->do_turn(client, player, command);
}
void GameController::set_next_state(TurnStateEnum state)
{
_turn_state = _turn_states_map.at(state);
}
void GameController::initialize_turn_states_map()
{
_turn_states_map.insert(std::make_pair(TurnStateEnum::SETUP, std::make_shared(*this)));
}
Под заголовком TurnState:
Код: Выделить всё
class GameController;
class TurnState
{
public:
TurnState(GameController& gameCtrl);
virtual ~TurnState();
void next_state(TurnStateEnum stateEnum);
virtual void do_turn(Socket& client, Player& player, std::string command) = 0;
protected:
GameController& _gameCtrl;
};
Код: Выделить всё
TurnState::TurnState(GameController& gameCtrl) : _gameCtrl ( gameCtrl )
{
}
TurnState::~TurnState()
{
}
void TurnState::next_state(TurnStateEnum stateEnum)
{
_gameCtrl.set_next_state(stateEnum);
}
Редактирование 2 — минимальный пример версии 2
Это может быть лучший минимальный пример. Я создал консольный проект и загрузил его по адресу: https://ufile.io/ce79d
Подробнее здесь: https://stackoverflow.com/questions/426 ... om-leaking
Мобильная версия