2012-04-23 63 views
0

什麼我實現更復雜一點,所以我已經剝離下來的代碼獨立列表之間語句,並作出最簡單的例子可能是複製問題:順序插入/擦除導致賽格故障

我列出一個和B,在某些時候,我需要將1個元素從列表A移動到列表B.此對象在當前列表中存儲其位置(迭代器)。它適用於1個列表,插入和刪除。儘管如此,當在列表A的迭代週期內更改列表B時,我發現執行插入和擦除指令的順序決定了我是否遇到seg錯誤。下面是代碼:

typedef struct AO_ { 
    int id; 
    list<AO_*>::iterator thispos; 
} AnObject; 

class MyList { 
    public: 

    list<AnObject*> ll; 
    int sizell; 

    MyList(){ sizell=0; } 

    void insert(AnObject* AnObjecti){ 
     AnObjecti->thispos= ll.insert(ll.end(),AnObjecti); 
     sizell++; 
    } 

    list<AnObject*>::iterator remove(AnObject* AnObjecti){ 
     return ll.erase(AnObjecti->thispos); 
    } 

    void print(){ 
     cout << "contents:"; 
     list<AnObject*>::iterator itAux; 
     for (itAux=ll.begin(); itAux!=ll.end(); itAux++) 
     cout << " " << (*itAux)->id; 
     cout << endl;    
    }   
}; 

int main(int argc, char *argv[]){ 

    MyList* listA= new MyList(); 
    MyList* listB= new MyList(); 
    AnObject* objAux= new AnObject(); 

    for(int i=0; i<10; i++){ 
     objAux= new AnObject(); 
     objAux->id= i; 
     listA->insert(objAux); 
    } 

    cout << "list A:" << endl; listA->print(); 

    list<AnObject*>::iterator it= listA->ll.begin(); 
    while(it!=listA->ll.end()){ 
     objAux= (*it); 
     if(objAux->id==2){ 
      //listB->insert(objAux); //***THIS CAN GO HERE (seg fault on next cycle) 
      it= listA->remove(objAux);  
      listB->insert(objAux); //***OR THIS CAN GO HERE (all ok) 
     } 
     else 
      ++it; 
    } 

    cout << "list A:"; listA->print(); 
    cout << "list B:"; listB->print(); 
} 

和輸出:

list A: 
contents: 0 1 2 3 4 5 6 7 8 9 
list A:contents: 0 1 3 4 5 6 7 8 9 
list B:contents: 2 

我得到一個賽格故障,如果交換的指示標記由* 是否有人知道爲什麼嗎?

在此先感謝 何塞

回答

1

listB->insert的調用修改objAux->thispos指新的列表。然後,對listA->remove的調用將嘗試在其調用list::erase時使用該迭代器。將錯誤容器的迭代器傳遞給erase會導致未定義的行爲。