2011-08-24 5 views
1

Я хочу стереть элемент из вектора в C++, но он показывает ошибку утверждения среды выполнения.Показывает ошибку утверждения во время выполнения в векторе 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()) '. Получить первый элемент вектора и стереть его! – sarat

ответ

2

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

socketIterator = vectClientSocket.erase(socketIterator); 

смотрите также станд :: вектор < ..> :: Стирание (..) documentation

[EDIT]

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

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

Как я могу обновить свой итератор? после стирания. –

+0

см. Код, который я разместил! – Simon

+0

Я меняю свой код и использую! =(), Чтобы сравнить, но все же ту же ошибку. –

1

После этого l ине:

vectClientSocket.erase(socketIterator); 

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

SOCKET clientSocket=*socketIterator; 

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

+1

Не только разыменование итератора, также проверка состояния цикла является проблемой. – Simon

+0

@Simon: Хорошая точка. Фактически, глядя на точную ошибку, это более вероятный момент, в котором срабатывает утверждение. –