分割故障/错误读数变量-C 列表



我有一个我无法理解的分段故障。这是代码:

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

分割故障发生在我看起来很随机的时循环的窗帘迭代中。在访问列表中的第五元素时(具有值2的元素(在以下行中:

res = uniqueElements.insert(*iter);

问题是访问 *iter。当我通过GDB(在G 上(运行它时,我打印每个循环(GDB显示元素及其值的地址(,然后当我到达第五个循环时,它说"错误读取变量"。<<<<<<<<<<<<<<<<<</p>

至于副本我想我了解从列表中删除节点的逻辑,但我仍然有问题。 iter从iter (可能是错误的(更改为解决问题的尝试。我将其更改为

next = iter++;

我会收到以下错误:无效的指针程序收到信号sigabrt,中止

        next = ++iter;

iTer被递增,然后分配给下一个。Next和Iter现在都指向要删除的元素,或超过列表的最后一个元素。

        _list.erase(iter);

(错误的(元素(如果有(将被删除,接下来和迭代都无效。如果不幸,您会尝试删除最终迭代器。

        iter = next;

no-op。他们指向相同的元素,并在一起无效。

相关内容

  • 没有找到相关文章

最新更新