2012-10-23 4 views
0

연결된 목록 구현에 STL 목록을 사용하고 있지만 루프 내에서 지우기 기능을 사용하면 세그먼트 화 오류가 발생합니다. 누군가 그것이 왜 일어나고 있는지 말해 줄 수 있습니까?C++ 프로그램의 세그먼트 오류

void remove(list<int> &myList,int N){ 
    int k = 1; 
    list<int>::iterator it; 
    for(it = myList.begin(); it != myList.end();it++){ 
     if(k == N){ 
      myList.erase(it); 
      k = 1; 
     } 
     else 
      k++; 
    } 
} 
+0

디버거에서 문제를 일으키는 줄과 그 줄의 오류를 확인할 수 있습니까? –

답변

6

이터레이터에서 지우기를 호출하면 해당 이터레이터가 무효화됩니다. 그러나 당신은 그것을 계속 사용합니다. 이 같은 삭제의 반환 값을 캡처하고 반복자가 다시 할당해야합니다 :

it = myList.erase(it); 

그러나 이것은 루프에서 약간의 변화를 필요로합니다. 지우면, 증가하지 않으려합니다. 그 이유는 하나의 요소를 건너 뛸 것이기 때문입니다. 마지막 요소를 지우는 것을 끝내면 특히 나쁘다. 왜냐하면 마지막 반복자를 지나갈 것이기 때문이다. 당신이 삭제되지 않는한다면, 당신은 단지 를 증가해야합니다

for(it = myList.begin(); it != myList.end();){ 
    if(k == N){ 
     it = myList.erase(it); 
     k = 1; 
    } 
    else 
    { 
     k++; 
     ++it; 
    } 
} 
2

당신이 요소를 삭제하면, 그 반복자는 무효가됩니다. 다시 말하면, 다음 반복을 할 때 은 더 이상 의미가 없으므로 it은 더 이상 목록 요소를 가리 키지 않습니다. 코드 myList.erase가 IT (++)을 실행했을 때

void remove(list<int> &myList,int N){ 
    int k = 1; 
    list<int>::iterator it; 
    for(it = myList.begin(); it != myList.end();){ 
     if(k == N){ 
      myList.erase(it++); 
      k = 1; 
     } else{ 
      ++it; 
      k++; 
     } 
    } 
} 

는 반복자보다 개체 "는"대표

1

같이 해보기가 invalid.So이다, 즉 실행 정의되지 않는다 "를 ++"