好的,我编写了一个程序,当使用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。
谢谢!
最佳答案
您可能已经通过自身拼接创建了一个无效的std::list。
例如,splice的第三个变体的用法:
void splice(const_iterator pos, list& other,
const_iterator first, const_iterator last);
关于C++列表迭代器在遍历时永远不会到达end(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15019487/