gpt4 book ai didi

c++ - 如何将原始指针 vector 转换为唯一指针 vector ?

转载 作者:太空狗 更新时间:2023-10-29 20:03:31 25 4
gpt4 key购买 nike

#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;
}

我想摆脱原始指针,这样我就不用担心异常和清理问题。是否有简单易行的解决方案(我是一个非常愚蠢的青少年)还是不值得这样做?谢谢!

最佳答案

只需将您的 vector 更改为:

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 将其移动到 vector 中:

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));

最好在new 后立即将原始指针放入unique_ptr(或者最好使用std::make_unique) .否则,如果在 unique_ptr 中的分配和包装之间抛出异常,则会发生内存泄漏。

它与 unique_ptr 无关,但你的 GameStateshould have a virtual destructor .

Live demo

关于c++ - 如何将原始指针 vector 转换为唯一指针 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28262849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com