段故障:使用迭代器的插入功能

时间:2014-02-24 07:26:26

标签: c++ iterator insertion doubly-linked-list

我的插入功能出现问题导致分段错误(核心转储)。 老实说,我不知道那个错误究竟意味着什么。

这是我的插入功能:

void insert(Iterator<E> itr, E data)
{
  Node<E>* newnodeptr = new Node<E>();
  newnodeptr -> data = data;
  newnodeptr -> next = itr.current;
  itr.current -> prev -> next = newnodeptr;
  newnodeptr -> prev = itr.current -> prev;
  itr.current -> prev = newnodeptr;
}

我正在测试此函数的代码就是这个。

list<record> testlist;

name = "susan";
grade = 10;
temprec.studname = name;
temprec.Grade = grade;

testlist.push_back(temprec);

name = "joe";
grade = 15;
temprec.studname = name;
temprec.Grade = grade;

testlist.push_front(temprec);

name = "kerry";
grade = 7;
temprec.studname = name;
temprec.Grade = grade;

testlist.push_back(temprec);

searchit = testlist.begin();
for(searchit = testlist.begin(); searchit != testlist.end(); searchit++)        
  {
    cout << (*searchit).Grade << endl;
  }

searchit = studentlist.begin();
searchit++;
searchit++;

name = "frank";
grade = 11;
temprec.studname = name;
temprec.Grade = grade;

testlist.insert(searchit , temprec);
for(searchit = testlist.begin(); searchit != testlist.end(); searchit++)        
  {
    cout << (*searchit).Grade << endl;
  }

我的错误发生在第一次显示后,所以我认为插入功能是原因。请帮助我理解我在这里做错了什么以及如何解决它。

2 个答案:

答案 0 :(得分:0)

您的searchIt正在处理学生列表列表,但其他所有内容都在使用testlist。除非有一些其他代码添加到studentlist,否则它可能是空的,所以searchit ++将会结束。无论如何,它将添加到学生列表中,因此不会显示在您的输出中

searchit = studentlist.begin();

答案 1 :(得分:0)

Segmentation-Fault通常意味着您尝试访问不受程序控制或是程序限制区域的内存的某些部分。当您尝试访问容器边界之外的无效指针或取消引用迭代器时会发生这种情况。

既然你自己说,你可以显示testlist的内容,我会坚持黑暗给你的同样的建议:你可能在进入之前没有在studentlist中插入任何内容它。迭代器的dec / inc操作符必须能够访问容器的存储元素以查找下一个。如果迭代器无效,则可能会访问超出范围的内存位置。

或者你的程序在第一个for循环中崩溃了吗?

其次,你为什么插入如此复杂?您无需处理列表的上一个/下一个处理。这就是这些容器类的用途:抽象出细节。如果你想要更好的内存分配,你可以为此目的指定一个单独的分配器。