2011-03-14 1 views
4

코드 :cppcheck 오류 : 위험한 반복자 사용

for(x=abc.begin();x!=abc.end();x++) 
{ 
    if(-----) 
    { 
     ---- 
     abc.erase(x); 
    } 
} 

그리고 오류가
위험한 반복자 사용 :::입니다
반복자 그래서 그것을 역 참조 또는 다른 반복자와 비교 무효 삭제 후 이 잘못되었습니다 .

위의 코드에서 지우기 기능을 사용하는 데있어 잘못된 사용법은 무엇입니까?

답변

4

iterator x는 abc에서 해당 값을 삭제 한 후에 사용할 수 없습니다. 이것은 문제를 해결해야합니다 STL 컨테이너의

x = abc.begin(); 

while(x != abc.end()) 
{ 
    if (-----) 
    { 
     ---- 
     x = abc.erase(x); 
     // skipped only to next item 
    } 
    else 
    { // skip only to next item 
     ++x; 
    } 
} 

erase 템플릿 기능은 다음 요소를 반환하거나, end().

편집 : templatetypedef의 의견을 보내 주셔서 감사합니다.

+1

,하지만 조심 ... 당신은 바로 삭제 얻을 것들 후 요소 과거'x' 반복자를 건너 뛰는 끝날 것입니다. – templatetypedef

+0

Ups! 네가 옳아. 고정 응답 ... – harper

4

xabc에 대한 포인터입니다. x이 (가) 가리키는 항목을 지우면 x은 (는) 무슨 의미입니까? 은 (는) 어떻게 작동합니까?

5

루프에서 제어 변수로 x를 사용하고 있습니다. 그것은 erase()에 의해 무효화되므로, 루프의 최상위에서 그 값을 증가시키는 것이 안전하다고 (또는 의미있는) 확신 할 수 없습니다.

1

반복하는 컨테이너에 대해 언급하지 않았습니다. 컨테이너의 유형에 따라 어떤 반복자가 무효화되는지에 따라 다릅니다. 지워진 요소에 대한 반복자가 유효하지는 않지만 예를 들어 std::vector모두 지워진 요소의 반복자는 유효하지 않습니다 (end() 포함). 그리고 비록 알 수없는 이유로 set::erase이 반복자를 지우는 요소 만 무효화하더라도 iterator를 다음 요소로 반환하지 않습니다. std::set에 따라서

는 :

while (x != abc.end()) // end() will not change and even can be stored 
{ 
    if (...) 
     abc.erase(x++); // increments before erasing 
    else 
     ++x; 
} 
이 올바르게 무효화를 방지