C 程序中的分割故障

Segmentation fault in C++ program

本文关键字:分割 故障 程序      更新时间:2023-10-16

我正在为我的链接列表实现使用STL列表,但是当我在循环中使用擦除函数时,它会产生分割故障。有人可以告诉我为什么会发生吗?

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

在迭代器上调用擦除时,它会使该迭代器无效。但是您继续使用它。您需要捕获擦除的返回值,然后将其分配给迭代器,如这样:

it = myList.erase(it);

,但这需要稍微改变您的循环。如果擦除,那么您就不想增加,因为您将跳过一个元素。如果您最终擦除了最后一个元素,这尤其糟糕,因为那样您将经过末端迭代器。因此,如果您不删除:

,则只能增加
for(it = myList.begin(); it != myList.end(); ){
    if(k == N){
        it = myList.erase(it);
        k = 1;
    }
    else
    {
        k++;
        ++it;
    }
}

如果删除元素,其迭代器将变得无效。换句话说,当您进入下一个迭代时,您会执行it++,因为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++;
        }
    }
}

执行代码mylist.erase(it )时,比迭代器" it"表示的对象无效。