【发布时间】: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 作为解决问题的尝试..