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

标签 c++ std stdvector

我有一个标准的指针 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/

相关文章:

c++ - 交换重载算术运算符的参数

c++ - 从 map 中删除对象指针时避免内存泄漏

c++ - std::function 与标准函数

c++ - 如何遍历 std::vector<char> 并找到以 null 结尾的 c 字符串

c++ - 如果类数组中的 vector 是动态 push_backed,内存如何工作?

android - Eclipse 编译成功但仍然给出语义错误

c++ - 模板 type_trait 函数,接受给定类型和/或派生类型的容器

c++ - std::packaged_task 编译错误 w/gcc 4.6

c++ - 初始化指针 vector (自动)

c++ - std::sort 用于 C++ 中的二维 vector