我有这个函数,但是我不确定为什么在使用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
吗?
1条答案
按热度按时间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
.