Показывает ошибку утверждения во время выполнения в векторе c ++ - PullRequest
1 голос
/ 24 августа 2011

Я хочу стереть элемент из вектора в 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

Пожалуйста, помогите мне ... спасибо заранее.

Ответы [ 2 ]

2 голосов
/ 24 августа 2011

Вам необходимо обновить итератор после удаления элемента:

socketIterator = vectClientSocket.erase(socketIterator);

см. Также std :: vector <..> :: erase (..) документация

[EDIT]

Используйте оператор! = (..) для сравнения итераторов:

for(socketIterator=vectClientSocket.begin();socketIterator!=vectClientSocket.end();){
1 голос
/ 24 августа 2011

После этой строки:

 vectClientSocket.erase(socketIterator);

socketIterator - недопустимый итератор, потому что там, где он использовался для указания, было стерто. Между этой строкой и следующей итерацией в вашем цикле вы никогда не дадите ей правильное значение, поэтому эта строка в следующей итерации является недопустимым разыменованием.

SOCKET clientSocket=*socketIterator;

Как указывает Саймон, даже до этого условие цикла socketIterator<vectClientSocket.end() также будет вызывать неопределенное поведение, поскольку socketIterator больше не является действительным итератором для vectClientSocket.

...