2011-03-14 20 views
4

コード:cppcheckエラー:危険なイテレータの使用

for(x=abc.begin();x!=abc.end();x++) 
{ 
    if(-----) 
    { 
     ---- 
     abc.erase(x); 
    } 
} 

とエラーが:::
危険なイテレータの使用
で消去した後、イテレータはそれを間接参照したり、別のイテレータと比較すると、無効で無効です。

上記のコードで消去機能を使用すると間違った使い方は何ですか?

答えて

4

iterator xは、対応する値をabcから削除した後は無効です。これは、それを修正する必要がありますSTLコンテナの

x = abc.begin(); 

while(x != abc.end()) 
{ 
    if (-----) 
    { 
     ---- 
     x = abc.erase(x); 
     // skipped only to next item 
    } 
    else 
    { // skip only to next item 
     ++x; 
    } 
} 

eraseテンプレート関数は、次の要素を返す、またはend()

編集: templatetypedefによるコメントありがとうございました。

+1

これは正しく無効化を回避できますが、注意してください...あなたは右の消去を受けるものの後の要素過去 'X'イテレータを飛ばしてしまいます。 – templatetypedef

+0

アップ!あなたが正しい。固定の答え... – harper

4

xは、abcへのポインタです。 xが指摘している項目を消去したら、xは何を指しているはずですか?はどのように動作するのですか?

5

ループの制御変数としてxを使用しています。それはerase()によって無効になるので、ループの先頭でそれをインクリメントすることが安全である(または意味がある)ことは確かではありません。

1

反復処理中のコンテナについては何も言わなかった。コンテナの型は、どのイテレータが無効になっているかによって異なります。反復子を消去する要素は無効ですが、たとえばstd::vectorすべてイテレータの消去済み要素は無効になります(end()を含む)。 set::eraseは、イテレータからイレースされた要素だけを無効にしますが、未知の理由でイテレータを次の要素に戻しません。

だからstd::setで:

while (x != abc.end()) // end() will not change and even can be stored 
{ 
    if (...) 
     abc.erase(x++); // increments before erasing 
    else 
     ++x; 
} 
関連する問題