Как превратить вектор необработанных указателей в вектор уникальных указателей?

#include <vector>

enum ListOfGameStates
{
// List of game states
};

class GameState()
{
public:
GameStates(); // Initializes protected (global) variables
virtual ListOfGameStates run() = 0;
protected:
// Heavyweigh resource managers containing all resources and other global vars
}

class GameStateManager()
{
public:
GameStateManager();  // Creates all game states
~GameStateManager(); // Deletes all game states
void run();          // Switches from one state to another state
private:
// A vector of raw pointers to game states. GameState is a base class.
std::vector<GameState*> game_states_container;
}

Я хочу избавиться от необработанных указателей, чтобы не беспокоиться об исключениях и очистке. Есть простое простое решение (Я действительно тупой подросток) или оно того не стоит? Спасибо!

3

Решение

Просто измените свой вектор на:

std::vector<std::unique_ptr<GameState>> game_states_container;

И избавиться от любого delete в вашем деструкторе. На самом деле вы, вероятно, можете полностью избавиться от деструктора, если у него нет других дел.

unique_ptr не копируемый, но подвижный, поэтому стоит иметь представление о семантике перемещения C ++ 11. Когда вы хотите добавить unique_ptr к вашему контейнеру вы можете использовать push_back если вы передаете временное значение, например, возвращаемое значение функции:

game_states_container.push_back(createGameState());
game_states_container.push_back(std::make_unique<GameStateA>());  // C++14

Или если у вас есть местный unique_ptr переменная, которую вы можете использовать std::move чтобы переместить его в вектор:

std::unique_ptr<GameState> game_state = std::make_unique<GameStateA>();  // C++14
// auto game_state = std::unique_ptr<GameState>(new GameStateA);  // C++11
...
game_states_container.push_back(std::move(game_state));

Хорошей практикой является размещение сырых указателей в unique_ptr как только ты new их (или желательно использовать std::make_unique). В противном случае, если между распределением и переносом возникает исключение unique_ptr у вас утечка памяти

Это не связано с unique_ptr но твой GameState учебный класс должен иметь виртуальный деструктор.

Живая демо

8

Другие решения


По вопросам рекламы [email protected]