2009-05-16 2 views
3

루프가 있습니다.이 코드는 어디에서 유효하지 않은 반복자를 역 참조하고 있습니까? (C++)

for(aI = antiviral_data.begin(); aI != antiviral_data.end();) 
{ 
    for(vI = viral_data.begin(); vI != viral_data.end();) 
    { 
     if((*aI)->x == (*vI)->x && (*aI)->y == (*vI)->y) 
     { 
      vI = viral_data.erase(vI); 
      aI = antiviral_data.erase(aI); 
     } 
     else 
     { 
      vI++; 
      aI++; 
     } 
    } 
} 

하지만 antiviral_data에 항목이 포함되어있을 때 "벡터 반복자가 dereferencable이 아닙니다."라는 오류가 발생합니다. 왜이 오류가 발생하며 유효하지 않은 반복자는 어디에서 참조 해제됩니까?

주의 : 지금까지 if() 문이 false 일 때만 오류가 발생합니다. if() 문이 true 일 경우 어떻게 될지 모르겠습니다.

답변

8

벡터의 크기는 무엇입니까?

viral_data에 antiviral_data 요소가 더 많이있는 경우, 동일한 비율로 aI와 vI를 증가시키기 때문에 vI 루프가 끝나기 전에 범위를 벗어납니다.

여기에 간단한 예제를 보자

for(int i = 0; i < 5;) 
{ 
    for(int j = 0; j < 10;) 
    { 
     i++; 
     j++; 
    } 
} 

당신은 루프의 이상가는 경우에, 당신은에 따라 내부 루프는 내가 10이다 모두 J 때까지 끝나지 않을 것이라는 점을 알 수 있지만 것입니다 당신의 외부 루프는, 내가 하지 당신은 증가 할 것이다 더 5.

다음해야 내가 (또는 귀하의 경우, 인공 지능)과 같이 외부 루프 :

for(int i = 0; i < 5;) 
{ 
    for(int j = 0; j < 10;) 
    { 
     j++; 
    } 
    i++; 
} 
+0

vI는 항상 2입니다. 감사합니다. 감사합니다. 감사합니다. –

1

는 역 참조는

((*aI)->x == (*vI)->x && (*aI)->y == (*vI)->y) 

에서 무슨 일이 일어나고 그 문이 antiviral_data 목록의 마지막 요소에 해당하는 경우가 발생합니다. 이 경우 내부 for 루프의 다음 반복에서 사용자는 antiviral_data.end()을 역 참조하는 것이 허용되지 않습니다.

관련 문제