2012-01-25 2 views
8
Driver::~Driver() 
{ 
    AutoCritSec acsDriverList(m_csDriverList,true); 
    DRIVERLIST::iterator it = m_DriverList.begin(); 
    for(;it!=m_DriverList.end();it++) 
    { 
     if (it->second == this) 
     { 
      m_DriverList.erase(it); 
      it = m_DriverList.begin(); 
     } 
    } 
} 

visual studio 2003에서 프로그램을 컴파일 할 때 프로그램이 잘 작동합니다. 하지만 난 2010 년에 동일한 작업을 수행 할 때 응용 프로그램을 종료 한 후 동안, 나는map/iterator가 incrementablemap이 아니거나 iterator가 증가하지 않음을 설정합니다.

Expression:map/set iterator not incrementable 

같은 몇 가지 오류가 발생하고 난이 무시 누를 때 나는

Expression:"standard c++ library out of range" && 0 

어떤 일이 무엇인지 어떤 생각을 가지고 있습니까 얻을 여기서 진행 : 나는 누구에게나 제안에 대해 극도로 빚을 질 것이다. 감사와 따뜻한 소망의 톤.

답변

12

this이 목록의 유일한 요소 인 경우 목록의 끝을 오버런합니다.

this을 목록에서 제거하면 it = m_DriverList.begin();이 다시 설정됩니다. 이건 괜찮아. 그런 다음 루프식이 계산되어 (for 문에서 i++), it이 범위의 끝을 지나서 진행됩니다.

반복자를 컨테이너 끝까지 지나치게하면 프로그램에서 정의되지 않은 동작을 보입니다. 최근 버전의 Visual C++에서는 프로그램의 디버그 빌드에서 많은 일반적인 반복기 오류를 유용하게 감지하고이를 해결하는 데 도움이되는 어설 션을 발생시킵니다.

당신은 루프 식을 제거하고 else 문으로 이동하여 문제를 해결할 수 있습니다

while (it != m_DriverList.end()) 
{ 
    if (it->second == this) 
    { 
     m_DriverList.erase(it); 
     it = m_DriverList.begin(); 
    } 
    else 
    { 
     ++it; 
    } 
} 

비록을 때마다이 요소가 오히려 낭비 제거를 반복 다시 시작. 대신 erase에 대한 호출에 의해 반환 된 반복자를 사용하여 사용하는 것이 좋습니다 다음과 같이 연관 컨테이너에 대한

it = m_DriverList.erase(it); 
+0

좋은 추천/제거합니다. 이 특별한 경우 m_DriverList는 분명히 쌍의 컨테이너이거나 테스트가 두 번째로 있기 때문에 어떤 종류의 맵입니다. std :: remove 대신 lambda 또는 비교 함수를 사용하여 std :: remove_if가 필요합니다. –

+0

컨테이너가 맵 (질문 제목, 'second second' 멤버에 대한 액세스) 인 경우에는 지우기 - 제거 * 이디엄을 적용 할 수 없다고 생각합니다. 관용구는 while 루프와 비슷하지만 반복을 다시 시작하는 대신 이터레이터를 복사하고 앞으로 이동 한 다음 현재 위치를 지 웁니다. –

+0

@ DavidRodríguez-dribeas @MarkTaylor : 좋은 캐치; 나는 변수 이름에서 "List"에 정신이 산만했다. C++ 11에서,'erase'는 반복자를 다음 요소 (또는 다음 요소가 없다면 한쪽 끝까지)로 반환하고, Visual C++ 2010은이를 지원합니다. –

6

올바른 삭제 관용구는 다음과 같습니다 삭제의

for (auto it = container.begin(); it != container.end() /* not hoisted */; /* no inc. */) 
{ 
    if (delete_condition) 
    { 
     container.erase(it++); 
    } 
    else 
    { 
     ++it; 
    } 
} 
관련 문제