c ++ std vector - 无效的迭代器问题

Bri*_*ter 1 c++ std stdvector

我有一个标准的指针向量.

在什么情况下,这个向量中的迭代器可能会失效?

我有理由相信,当一个对象被删除时,任何引用它的向量迭代器都会因此失效.然而,这对我来说似乎不正确.我相信这将是Managed .NET中容器的标准行为,但在c ++中这似乎不合适.

for (It = Vec.begin(); It != Vec.end(); It++){
  GoToOtherCode((*It));
}

function GoToOtherCode (ObjectType* Obj){
  delete Obj;
}
Run Code Online (Sandbox Code Playgroud)

这会使Iterator无效吗?在我看来它不应该,但是我遇到了一个难以调试的问题!(我害怕我的解决方法 - 通过整数索引遍历向量.(这很好......我只是害怕上面导致失效问题的原因).

在此先感谢您的时间.

编辑:感谢您的建议.普遍的共识是上述代码是危险的,但它不会使迭代器无效.我相信我在Visual Studio 2008调试器中遇到错误,因为在第二天打开项目后,这个无效的问题就消失了.所以 - 就像计算机中的许多东西一样,如果其他任何东西看起来都不起作用,请尝试重置该东西.

小智 8

它不会使迭代器失效,它实际上是你删除向量所拥有的堆分配对象的方式,clear()方法不会为你做那个.这很常见:

for (It = Vec.begin(); It != Vec.end(); It++)
  delete *It;

Vec.clear();
Run Code Online (Sandbox Code Playgroud)

如果您不尝试使用刚刚删除的内容,那就完全没问题.