2013-02-22 9 views
5

私はVisual C++コンパイラでコンパイルすると完全に正常に動作するプログラムを作成しました。今、私はそれをlinuxに移植したいが、linuxでコンパイルした後に起こっている厄介なことが起こっている。C++のリストイテレータは、反復処理時にend()に到達しません

したがって、イテレータを使用してリストをループしようとしています。ここにコード:

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()'イテレータを指していたことがわかりました。 ) 'iteratorだから私は' ++ irit 'と呼んだとき、' begin() 'に戻りました。それは期待された行動ですか?それは私に似たループを使用してサイズを計算するので、あまりにも無限ループを引き起こし

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

こと: そして、私が見つけたもう一つの事は、私がこれを行うときということです。それで、それは正しい行動が期待できないのですか?

誰かに問題の可能性のあるヒントを教えてもらえますか?

ああ、私はUbuntu 12.10、g ++バージョン4.7.2、Linux GCCのEclipse IDEをツールチェーンとして使用しています。

ありがとうございます!

+0

はい、それは標準です::リスト –

+4

これは期待された動作ではありません。メモリの破損のように見えますが、 'end'ポインタを見て、あなたのプログラムをステップバイステップで調べることができますか? – filmor

+3

どこからfuncItを取得しますか?タイプの 'funcIt-> second'とは何ですか?型の 'funcIt-> second.prologue'とは何ですか? –

答えて

5

スプライシングによって無効なstd::listが作成された可能性があります。例えば

spliceの第3の変形例の使用:

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

3)は*thisother範囲[first, last)の要素を移動します。要素は、posが指す要素の前に挿入されます。 posが範囲[first,last)のイテレータである場合、動作は未定義です。