【问题标题】:segmentation fault/ error reading variable - c++ list [duplicate]分段错误/错误读取变量 - C++ 列表 [重复]
【发布时间】:2018-09-14 03:56:05
【问题描述】:

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

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 个时,它显示“错误读取变量”。

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

next = iter++;

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

【问题讨论】:

  • iter++ 而不是 ++iter;
  • 我实际上将 iter++ 更改为 ++iter 作为解决问题的尝试..

标签: c++ segmentation-fault


【解决方案1】:
        next = ++iter;

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

        _list.erase(iter);

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

        iter = next;

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

【讨论】:

    猜你喜欢
    • 2016-01-12
    • 2012-05-26
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2019-03-14
    • 1970-01-01
    相关资源
    最近更新 更多