2012-10-23 63 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++,這不再有意義,因爲it不再指向列表的一個元素。

1

像這樣做,

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++; 
     } 
    } 
} 

當被執行的代碼myList.erase(它++),對象比迭代「它」表示是invalid.So,即未定義執行「它++」