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
我得到一個賽格故障,如果交換的指示標記由* 是否有人知道爲什麼嗎?
在此先感謝 何塞