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++;
        }

1 つの要素が削除されると、実行時エラーが表示されます。

ここに画像の説明を入力

助けてください...よろしくお願いします。

4

2 に答える 2

2

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

socketIterator = vectClientSocket.erase(socketIterator);

std::vector<..>::erase(..)のドキュメントも参照してください

[編集]

演算子 !=(..) を使用して反復子を比較します。

for(socketIterator=vectClientSocket.begin();socketIterator!=vectClientSocket.end();){
于 2011-08-24T06:34:00.207 に答える
1

この行の後:

 vectClientSocket.erase(socketIterator);

socketIterator以前に指していた場所が消去されているため、無効な反復子です。この行とループの次の反復の間に有効な値を与えることはないため、次の反復のこの行は無効な逆参照です。

SOCKET clientSocket=*socketIterator;

Simon が指摘しているように、これより前であっても、ループ条件socketIterator<vectClientSocket.end()は未定義socketIteratorの動作を引き起こしますvectClientSocket

于 2011-08-24T06:34:58.400 に答える