【问题标题】:Convert c++98 code to new c++17 code when using std::vector of pointers使用指针的 std::vector 时将 c++98 代码转换为新的 c++17 代码
【发布时间】:2023-02-03 17:33:06
【问题描述】:

我不管理什么或更少,因为我可以管理原始指针在示例中注意我必须删除对象,然后再将其从向量中删除我想在这里和以后避免它 将此代码转换为使用 unique_ptr 或 shared_ptr 的最佳案例

class GameState
{
    public:
        virtual bool onEnter() = 0;
        virtual bool onExit() = 0;
        virtual std::string getStateID() const = 0;
};

class MenuState : GameState
{
        public:
             MenuState(){};
             virtual ~MenuState(){};             
             bool onEnter(){};
             bool onExit(){};
             std::string getStateID() const;
        private:
             static const std::string s_menuId;

};

class StateMechine
{
    
    public:
        void pushState(GameState* pState)
        {
            m_gameStates.pop_back(pState);
            m_gameStates.back()->onEnter();
        }

        void changeState(GameState* pState)
        {
            if(!m_gameStates.empty())
            {
                if(m_gameStates.back()->onExit())
                {
                    delete m_gameStates.back();
                    m_gameStates.pop_back();
                }
            }
        }

         
    private:
        std::vector<GameState*> m_gameStates;
}

int main(int argc ,char** argv)
{
    GameState *gs  = new MenuState();
    StateMechine sm;
    sm.pushState(gs);
    sm.changeState(gs);
}

【问题讨论】:

    标签: c++ c++17 shared-ptr unique-ptr raw-pointer


    【解决方案1】:

    此代码使用原始指针来管理对象,如果处理不当,可能会导致内存泄漏。为避免这种情况,您可以用 std::unique_ptr 或 std::shared_ptr 替换原始指针。例如:

    class StateMechine
    {
        
        public:
            void pushState(std::unique_ptr<GameState> pState)
            {
                m_gameStates.pop_back(std::move(pState));
                m_gameStates.back()->onEnter();
            }
    
            void changeState(std::unique_ptr<GameState> pState)
            {
                if(!m_gameStates.empty())
                {
                    if(m_gameStates.back()->onExit())
                    {
                        m_gameStates.pop_back();
                    }
                }
            }
    
             
        private:
            std::vector<std::unique_ptr<GameState>> m_gameStates;
    }
    
    int main(int argc ,char** argv)
    {
        auto gs  = std::make_unique<MenuState>();
        StateMechine sm;
        sm.pushState(std::move(gs));
        sm.changeState(std::move(gs));
    }
    

    在这里,std::unique_ptr 管理对象的生命周期,并在它们超出范围或被移动时自动删除它们。这确保您的代码中没有内存泄漏。

    一般来说,当你想转移一个对象的所有权时,std::unique_ptr 是一个不错的选择,而当你想在多个所有者之间共享一个对象时,std::shared_ptr 是一个不错的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-08
      • 2023-04-06
      • 1970-01-01
      • 2014-01-25
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多