【发布时间】:2011-09-26 04:58:54
【问题描述】:
当我比较两个迭代器时,我看到了一些不寻常的行为。
vector<list<MyClass*>> vlWatchers(10);
list<MyClass*>::iterator itCurrent, itEnd;
for (int i(0); i <= 9; ++i)
{
itCurrent = vlWatchers[i].begin();
itEnd = vlWatchers[i].end();
while (itCurrent != itEnd)
{
//code
}
}
将在 while() 行上导致 liste 迭代器不兼容错误,并且似乎在 i = 0 时发生,尽管仅在某些时候发生。
在调用错误后进一步调查,itEnd和itCurrent都等于0xcdcdcdcd。奇怪的是,当我进入 != 比较运算符时,“this”指针变为 0xcdcdcdcd。 0xcdcdcdcd 不应该是存储在迭代器中的值,而不是迭代器本身的地址?或者是否存在某种迭代器黑魔法,其中迭代器既存储值又是值?这是一个更大项目的一部分,但错误是可重复的。
提前感谢您的帮助!
【问题讨论】:
-
您使用的是 C++0x 编译器吗?如果不是,则您的示例在第一行(模板的双右括号)中有语法错误。
-
另外,你能说明你使用的是哪个编译器吗?
-
@Space_C0wb0y:最新的 MSVC 默认启用(Microsoft 的不太完整的实现)C++0x。
-
我怀疑您可能因为擦除/删除操作而使迭代器无效。检查此线程以确保安全:stackoverflow.com/questions/4645705/vector-erase-iterator/…
-
@Marius:那只是 MSVC++ 不符合标准。在 C++0x 之前,这是无效的,尽管 MSVC++ 会接受它。
标签: c++ list visual-c++ iterator