2016-12-02 5 views
0

にこれは私が実行しているコードである一方、ベクターから消去:とSegfaultネストされたループ

for(auto candidate = candidates.begin(); candidate != candidates.end();) { 
    for(auto inst = candidate->sortedLoads.begin(); inst != candidate->sortedLoads.end(); inst++) { 
     if(...) { 
      candidate = candidates.erase(candidate); 
      break; 
     } 

     else { 
      candidate++; 
     } 
    }   
} 

上記とセグメンテーション違反に実行しています。内側forループを削除すると、segfaultが消えます。あなたは何が間違っているか知っていますか?

答えて

0

EDIT
あなたは何も彼はそのは、UpperBound candidate != candidates.end()を超えないようにしない内側のループ、外側のループからあなたcandidate変数をインクリメントしています。あなたの内側のループにも少なくともその条件を加えてください。あなたは、になってしまいます:

for(auto candidate = candidates.begin(); candidate != candidates.end();) { 
    for(auto inst = candidate->sortedLoads.begin(); candidate != candidates.end() && inst != candidate->sortedLoads.end() ; inst++) { 
     if(...) { 
      candidate = candidates.erase(candidate); 
      break; 
     } 

     else { 
      candidate++; 
     } 
    } 
} 

しかし、一般的に、あなたは/デクリメントをインクリメントするかどう(または任意の値を変更する操作)別のループ内のループ変数は、あなたがどこ変数(最初のループ状態を繰り返す必要があります2番目のループ(どこから変更されていますか)にあります。

+0

うわー、ちょうど私が見つめていたときにこれが気に入って、フォーマットが正しいことを確認してください。ありがとう! –

+1

実際には終了しましたが、 '候補 'がその下から変更されたときに' inst'の変更がありません。 – user4581301

+0

良い点は、私は最後の単純化を出ました。この文脈では正しくありませんでした。私はインナーループの条件も変えました。 Thanx @ user4581301。 Prasanna UVあなたは注意を払わなければなりません –

0

問題1:

inst = candidate->sortedLoads.begin(); 

instcandidate内部の何かにイテレータです。 candidateが消去されている場合は、instとは何ですか?誰も知らない。

問題2:単にcandidateinstがインクリメントされているとします。

inst != candidate->sortedLoads.end() 

instcandidatesortedLoads内のエントリを参照し、別のcandidateにおける他sortedLoadsendと比較されます。悪いことが起こる前に、出口条件はほぼ確実に満たされません。

問題3:J.Baobyは既にカバーしています。candidateの末尾をオーバーシュートするテストはありません。

あなたのための良い解決策はありません。 instcandidateの間のロジックを解くことをお勧めします。

+0

erase()の内部ループから壊れていても問題1は問題ですか?問題2と3は合理的な欠陥であり、合意されている。 –

+0

@PrasannaUV私は休憩を逃した。あなたはその1ビートを持っているべきです。 – user4581301

+0

問題2を解決するには、 '候補 'をインクリメントするときに' break'を追加します。しかし、それはあなたの内側のループが意味をなさないことを意味します...両方の場合にループが壊れているif-else構造! =>内部ループは必要ありません –