2011-08-24 4 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 (! vec.end())'루프 대신 while 루프를 사용하는 것이 좋습니다. 벡터의 첫 번째 요소를 가져와 지 웁니다. – sarat

답변

2

당신은 요소 삭제 후 반복자를 업데이트해야합니다

socketIterator = vectClientSocket.erase(socketIterator); 

도 참조 표준 : : 벡터를 < ..> :: 삭제 (..) documentation

[편집]

반복자를 비교하려면! = (..) 연산자를 사용하십시오.

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

이터레이터를 어떻게 업데이트 할 수 있습니까? 지우기 후에. –

+0

게시 된 코드를 참조하십시오! – Simon

+0

나는 내 코드를 변경하고! =()를 사용하여 비교하지만 여전히 같은 오류를 사용합니다. –

1

이 후 오프라인 :이 점에 사용되는 경우 삭제 되었기 때문에

vectClientSocket.erase(socketIterator); 

socketIterator 잘못된 반복자입니다. 루프를 통해이 선과 다음 반복 사이에 유효한 값을 제공하지 않으므로 다음 반복의이 선은 유효하지 않은 참조가됩니다. 사이먼이 지적 하듯이 socketIteratorvectClientSocket에 유효한 반복자가 더 이상 같이

SOCKET clientSocket=*socketIterator; 

, 심지어이 전에 루프 조건 socketIterator<vectClientSocket.end()은 정의되지 않은 동작이 발생하지 않습니다.

+1

반복기를 역 참조 할 때만 루프 상태를 검사하는 것이 문제입니다. – Simon

+0

@ 시몬 : 좋은 지적. 사실 정확한 오류를 살펴보면이 것이 어설 션이 발생하는 가능성이 높은 지점입니다. –

관련 문제