我有一个标准的指针 vector 。
在什么情况下,这个 vector 中的迭代器可能会失效?
我有理由相信,当一个对象被删除时,任何引用它的 vector 迭代器都会因此失效。但是,这对我来说似乎不正确。我确实相信这将是 Managed .NET 中容器的标准行为,但在我看来这在 c++ 中是不对的。
for (It = Vec.begin(); It != Vec.end(); It++){
GoToOtherCode((*It));
}
function GoToOtherCode (ObjectType* Obj){
delete Obj;
}
这应该使 Iterator It 无效吗?在我看来它不应该,但后来我遇到了一个难以调试的问题! (我害怕我的解决方法——通过整数索引遍历 vector 。(这工作正常......我只是害怕为什么上面会导致无效问题)。
提前感谢您的宝贵时间。
编辑:感谢您的建议。普遍的共识是上面的代码是危险的,但它不会使 Iterator 失效。我相信我遇到了 Visual Studio 2008 调试器的错误,因为在第二天打开项目后,这个无效问题就消失了。所以——就像计算机中的许多东西一样,如果没有别的办法,请尝试重置它。
最佳答案
它不会使迭代器无效,它实际上是您删除 vector 拥有的堆分配对象的方式,clear() 方法不会为您执行此操作。这很常见:
for (It = Vec.begin(); It != Vec.end(); It++)
delete *It;
Vec.clear();
如果您不尝试使用刚刚删除的内容,那就太好了。
关于c++ std vector - 无效的迭代器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1495549/