【问题标题】:Unusual behaviour with std::list<myclass*>::iterator comparisonstd::list<myclass*>::iterator 比较的异常行为
【发布时间】: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


【解决方案1】:

让我们按照逻辑链(假设您的for 循环的前几行与描述的完全一样):

  • itCurrent-&gt;this == 0xcdcdcdcd,因此...
  • itCurrent == 0xcdcdcdcd,因此...
  • vlWatchers[i].begin() 返回了0xcdcdcdcd,因此...
  • vlWatchers[i] 无效,因此可能...
    • i &gt;= vlWatches.size(),或
    • vlWatchers 无效

我以某种方式投票给vlWatchers.size() == 0。你可以在你的方法中添加一个检查来检测这种情况吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    相关资源
    最近更新 更多