c++ 在pop_back()之前对std::vector::back()使用delete,并对新元素使用std::move()

62lalag4  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(271)

我有这个函数,但是我不确定为什么在使用m_gameStates.pop_back()之前需要使用delete m_gameStates.back(),因为我知道pop_back()会破坏元素。

//in header :
     std::vector<std::unique_ptr<GameState>> m_gameStates;
... 
...

void GameStateMechine::changeState(std::unique_ptr<GameState> pState)
{
    if(!m_gameStates.empty())
    {
        if(m_gameStates.back()->getStateID() == pState->getStateID())
        {
            return;
        }
        if(m_gameStates.back()->onExit())
        {
            delete m_gameStates.back();
            m_gameStates.pop_back();
        }
        m_gameStates.push_back(std::move(pState));
        m_gameStates.back()->onEnter();
    }
}

delete操作是否不必要?
此外,对于复杂对象,使用std::move()(而不是复制)是否总是正确的做法?
例如:

m_gameStates.push_back(std::move(pState));

更新日期:

我在std::vector中使用std::unique_ptr时遇到了很多问题。如果我删除它并在std::vector中使用原始指针,我还需要使用delete吗?

xsuvu9jc

xsuvu9jc1#

unique_ptr的意义在于pointer只有一个所有者,并且当它的所有者销毁unique_ptr时,pointer也会被删除。当你调用m_gameStates.pop_back()时,它会销毁最后一个元素,而这个元素是unique_ptr的所有者。因此delete m_gameStates.back()是不必要的,甚至不应该编译。
您的std::unique_ptr<GameState> pState参数属于函数。如果m_gameStates.push_back(std::move(pState))中的std::move不属于函数,则pState将在函数结束时删除,因此您将其所有权移至vector,这是正确的。
如果你使用原始指针,你必须删除它时,你不需要它,并记住不要使用它后delete .如果GameState示例拥有在同一时间只有一个所有者std::move沿着std::unique_ptr将是一个好主意.如果你想GameState示例由多个所有者共享使用std::shared_ptr .

相关问题