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()」の直前にある要素) が「end(」ではなく「begin()」イテレーターを指していることがわかりました。 )' イテレータなので、'++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の 3 番目のバリエーションの使用法:

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

3) 範囲内の要素を[first, last)からに移動other*thisます。要素は、 が指す要素の前に挿入されposます。posが範囲内の反復子である場合、動作は未定義です[first,last)

于 2013-02-22T10:15:47.723 に答える