分段错误/错误读取变量 - c ++ list

时间:2018-04-04 14:21:50

标签: c++ segmentation-fault

我有一个我无法理解的细分错误。 这是代码:

void RemoveDuplicates(list<int>& _list)
{
    set<int> uniqueElements;
    list<int>::iterator iter = _list.begin();
    list<int>::iterator next;
    pair<set<int>::iterator, bool> res;

    while (iter != _list.end())
    {
        res = uniqueElements.insert(*iter);
        if (!res.second)
        {
            next = ++iter;
            _list.erase(iter);
            iter = next;
            continue;
        }
        iter++;
    }
}

并对该函数进行测试(在单独的文件中):

#include <list>
#include <iostream>
#include "lists.h"

using namespace std;

int main()
{
    list<int> list;
    list.push_front(12);
    list.push_front(7);
    list.push_front(2);
    list.push_front(9);
    list.push_front(12);
    list.push_front(12);
    list.push_front(19);

    RemoveDuplicates(list);
    cout << list.size() << endl;

    return 0;
}

分段错误发生在while循环的窗帘迭代中,对我来说看起来很随机。在以下行中访问列表中的第5个元素(值为2的元素)时:

res = uniqueElements.insert(*iter);

问题是访问* iter。 当我通过gdb(在g ++上)运行它时,我打印每个循环的* iter(gdb显示元素的地址及其值),然后当我到达第5个时,它说“读取变量&的错误” #39;

关于duplicate 我想我理解从列表中删除节点的逻辑,但我仍然有问题。 ++ iter从iter ++(可能是错误地)改变为尝试解决问题。 我把它改回了

next = iter++;

我收到以下错误: 指针无效 程序收到信号SIGABRT,已中止

1 个答案:

答案 0 :(得分:0)

        next = ++iter;

iter递增,然后分配给next。 next和iter现在指向要删除的元素后面的元素,或者超过列表的最后一个元素。

        _list.erase(iter);

(错误的)元素(如果有的话)被删除,使next和iter无效。如果不走运,你会尝试删除结束迭代器。

        iter = next;

无操作。他们指向同一个元素,并一起失效。