0

我的游戏的主循环如下所示:

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。那么如何解决这个问题呢?

谢谢。

4

1 回答 1

0

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

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

所以:statesToBeAdded只要你能保证你永远不会有任何不存在的东西,你就是安全的statesstatesToBeRemoved不同的是:对象已经存在并且在 中states,并且拥有对象的所有权是有意义states的 - 因此原始指针将是statesToBeRemoved.

State请注意,所有这些都是基于您显示的几行代码,根据情况,将s 而不是unique_ptr<State>s 存储在您的 s 中可能是有意义的states,等等...

于 2013-02-21T00:08:12.013 回答