使用std :: list <myclass *> :: iterator comparison </myclass *>的异常行为

时间:2011-06-30 17:52:28

标签: c++ list visual-c++ iterator

当我比较两个迭代器时,我看到了一些不寻常的行为。

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迭代器在while()行上出现不兼容的错误,并且在i = 0时会出现,尽管只是部分时间。

在调用错误后进一步调查,itEnd和itCurrent都等于0xcdcdcdcd。奇怪的是当我进入!=比较运算符时,“this”指针变为0xcdcdcdcd。 0xcdcdcdcd不应该是存储在迭代器中的,而不是迭代器本身的地址吗?或者是否有某种迭代器黑魔法,其中迭代器都存储一个值而IS是值?这是较大项目的一部分,但错误是可重复的。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

让我们遵循逻辑链(假设您的for循环的前几行完全如上所述):

  • itCurrent->this == 0xcdcdcdcd,因此......
  • itCurrent == 0xcdcdcdcd,因此......
  • vlWatchers[i].begin()返回0xcdcdcdcd,因此......
  • vlWatchers[i]无效,因此也许......
    • i >= vlWatches.size()
    • vlWatchers无效

我以某种方式投票给vlWatchers.size() == 0。您可以在方法中添加检查以检测该情况吗?