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

好的,我编写了一个程序,在使用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); } 

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

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

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

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

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

谢谢!

你可能通过拼接创建了一个无效的std :: list 。

例如,使用拼接的第三种变体:

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

3)将范围[first, last)的元素从other变成*this 。 这些元素插在pos指向的元素之前。 如果pos是范围[first,last)的迭代器,则行为是不确定的。