5

好的,我写了一个程序,它在用 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。

谢谢!

4

1 回答 1

5

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

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

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

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

于 2013-02-22T10:15:47.723 回答