2011-08-24 8 views
1

ベクトルから要素を消去したいのですが、ランタイムアサーションエラーが表示されます。実行時のアサーションエラーをベクトルC++で表示します

私のコードは次のとおりです。

int i=0; 
     for(socketIterator=vectClientSocket.begin();socketIterator!=vectClientSocket.end();){ 
      SOCKET clientSocket=*socketIterator; 

      isTrue=getBufferData(strt,stp,rm,clientSocket); 
      if(!isTrue){ 
       vectClientSocket.erase(vectClientSocket.begin()+i); 

       vector<RMLObserver*>::iterator it; 
       for(it=vectRMLObserver.begin();it<vectRMLObserver.end();it++) 
       { 
        RMLObserver *observer = (RMLObserver*)*it; 
        observer->infosetSent(info->getRMLThinTranskportToken()); 
       } 
      } 
      else 
       ++socketIterator; 

      i++; 
     } 

一つの要素が削除されると、それはランタイムエラーを示し、

enter image description here

私を助けてください...事前にありがとうございます。

+0

http://stackoverflow.com/questions/4645705/vector-erase-iterator/4645758#4645758 –

+0

ループwhile while(!vec.end())の代わりにwhileループを使用することをお勧めします。ベクトルの最初の要素を取得し、それを消去します。 – sarat

答えて

2

あなたは要素を消去した後、あなたのイテレータを更新する必要があります。

socketIterator = vectClientSocket.erase(socketIterator); 

もはstd ::ベクトル<を参照してください。..> ::消去(..)documentation

[EDIT]

イテレータを比較するには、演算子!=(..)を使用します。

for(socketIterator=vectClientSocket.begin();socketIterator!=vectClientSocket.end();){ 
+0

イテレータを更新するにはどうすればよいですか?消去後 –

+0

私が掲載したコードを見てください! – Simon

+0

私は自分のコードを変更し、!=()を使って比較しますが、同じエラーを返します。 –

1

この後INE:それはポイントに使用場所を消去されていますので、

vectClientSocket.erase(socketIterator); 

socketIteratorが無効イテレータです。この行とループを通る次の繰り返しの間には、有効な値を与えないので、次の反復でこの行は無効な逆参照になります。

SOCKET clientSocket=*socketIterator; 

サイモンが指摘するようにsocketIteratorは、もはやvectClientSocketに有効なイテレータであるとして、でもこの前、ループ条件socketIterator<vectClientSocket.end()も未定義の動作を引き起こすことはないでしょう。

+1

イテレータを参照解除するだけでなく、ループ状態をチェックすることも問題です。 – Simon

+0

@サイモン:良い点。実際には正確なエラーを見て、これはアサートが発生する可能性の高いポイントです。 –

関連する問題