2011-05-16 5 views
0

다음 코드가 실패하는 이유는 무엇입니까? 당신이 이미 .end() 동일 할 때 for 문의 증가 부분에 itrUICon를 증가 다음 벡터의 마지막 항목을 삭제하고 있습니다 아마 때문에벡터 요소를 지울 때 프로그램이 깨집니다.

typedef vector<SOCKET /*socket*/> UIConnection; 

UIConnection::iterator itrUICon; 

for (itrUICon = m_ListUIConnection.begin();itrUICon != m_ListUIConnection.end();itrUICon++) 
{ 
    if (*itrUICon == nSock) 
    {   
     itrUICon = m_ListUIConnection.erase(itrUICon);   
    } 
} 

답변

4

.

erase()/std::remove() 관용구를 사용하거나 적어도 for 문에서 증가분을 이동하고 erase을 실행하지 않은 경우에만 수행하십시오.

+0

찰스는 map.TypeDef지도와 함께 작동합니다. GatewayConnection; –

+0

@Chris_vr : 순서를 보존하기 때문에'std :: remove'는 연관 컨테이너에 대해 작동하지 않습니다. 맵에서 요소를 지우더라도 제거 된 요소를 가리키는 반복자가 아닌 다른 반복자를 무효화하지 않기 때문에'mp.erase (it ++); '를 대신 할 수 있습니다. –

6

for 지침에서 ++itrUICon을 제거해야합니다.

UIConnection::iterator itrUICon; 

for (itrUICon = m_ListUIConnection.begin();itrUICon != m_ListUIConnection.end();) 
{ 
    if (*itrUICon == nSock) 
    {   
     itrUICon = m_ListUIConnection.erase(itrUICon);   
    } 
    else ++itrUICon; 
} 
+0

당장, 맞아! 나는 나의 마지막 프로젝트에서 그 하나를 실제로 기억한다. – Xeo

+0

왜 downvote? – Simone

+0

@ Simone : 아마 임의의 drive-by. 나는 너와 같은 시간에 하나를 받았다. –

관련 문제