如何在不同的std :: vector中删除相同的指针?

时间:2013-02-20 23:47:27

标签: c++ pointers stdvector game-loop

我的游戏主循环看起来像这样:

std::vector<std::unique_ptr<State>> states;

for(size_t i = 0; i < states.size(); i++)
{
     states[i]->Update();
     states[i]->Draw();

}
但是,他们是一个缺陷。我无法在迭代期间修改向量(删除状态),因为如果我删除当前状态,则迭代打开然后它会明显中断,因为没有状态可以调用更新和绘制。所以我认为制作一个应该添加到states向量的状态向量并创建一个应该删除到states向量的状态向量是个好主意。然后在循环结束后修改states向量,迭代中不会出现任何问题。

std::vector<std::unique_ptr<State>> states;
std::vector<std::unique_ptr<State>> statesToBeAdded;
std::vector<std::unique_ptr<State>> statesToBeRemoved;

for(size_t i = 0; i < states.size(); i++)
{
    states[i]->Update();
    states[i]->Draw();

}

for(size_t i = 0; i < statesToBeAdded.size(); i++)
{
    states.push_back(std::move(statesToBeAdded[i]));
}
statesToBeAdded.clear();

for(size_t i = 0; i < statesToBeRemoved.size(); i++)
{
    states.erase(std::remove(states.begin(), states.end(), statesToBeRemoved[i]), states.end());
}
statesToBeRemoved.clear(); //error is thrown here

我无法从states向量中删除状态,statesToBeRemoved.clear()行会出现错误,我认为这是因为当我调用states.erase(...)行时会删除该元素来自states向量,从而使statesToBeRemoved向量中的相同元素无效,因为该元素指向不再存在的对象。

你不能只删除一个std :: unique_ptr而不破坏指针指向的内容,所以我认为没有办法从states向量中删除元素而不会使statesToBeRemoved向量中的元素无效{1}}向量。那怎么解决这个问题呢?

感谢。

1 个答案:

答案 0 :(得分:0)

不同的指针类型可以满足不同的所有权语义:

  • unique_ptr用于唯一所有权,这就是您当前代码不起作用的原因
  • shared_ptr用于共享所有权 - 当管理对象的最后一个shared_ptr超出范围时,它将被销毁
  • 原始指针(*)并没有真正说出他们正在建模的语义,但你必须手动强制执行所有约束 - 这就是使它们变得危险的原因。然而,对于那些从未拥有对象所有权的指针,它们是安全的(并且在我看来是明智的选择)。

所以:你的statesToBeAdded是安全的,只要你可以保证你在states中没有任何东西。 statesToBeRemoved是不同的:对象已经存在于states中,让states取得对象的所有权是有意义的 - 因此原始指针对于{{{{{{{ 1}}。

请注意,所有这些都是基于您展示的几行代码,具体取决于您可能在statesToBeRemoved而不是State中存储unique_ptr<State>的情况。 {1}}等等......