C ++列表迭代器在迭代时永远不会到达end()

时间:2013-02-22 08:03:02

标签: c++ linux list iterator g++

好的,我编写了一个程序,在使用Visual C ++编译器编译时运行得非常好。现在我想将它移植到linux,但是在我在linux中编译之后发生了一些奇怪的事情。

所以,我试图使用迭代器遍历列表。代码如下:

for (list<IntermediateRepresentation>::iterator irIt = funcIt->second.prologue.begin(); irIt != funcIt->second.prologue.end(); ++irIt) {
    irIt->address = address;
    address += getOpcodeSize(irIt->opcode);
}

现在的问题是上面的代码会导致无限循环。我试着看看它为什么在调试器中这样做,我发现列表的最后一个元素(就在'end()'之前的那个)指向'begin()'迭代器而不是'end( ''迭代器所以当我调用'++ irIt'时,它又回到'begin()'。这是预期的行为吗? 我发现的另一件事是,当我这样做时:

size_t irSize = funcIt->second.prologue.size();

导致无限循环,因为它使用类似于我的循环来计算大小。那么,它不能预期行为正确吗?

任何人都可以给我一些提示,问题可能在哪里?

哦,我正在使用Ubuntu 12.10,g ++版本4.7.2,以及使用Linux GCC作为工具链的eclipse IDE。

谢谢!

1 个答案:

答案 0 :(得分:5)

您可能通过拼接自身来创建无效的std::list

例如,使用splice的第三个变体:

void splice(const_iterator pos, list& other, 
            const_iterator first, const_iterator last);
  

3)将[first, last)范围内的元素从other移动到*this。元素在pos指向的元素之前插入。如果pos[first,last)范围内的迭代器,则行为未定义。