Ошибка сегмента: функция вставки с использованием итераторов

0

У меня возникают проблемы с моей функцией вставки, вызывающей ошибку сегментации (основной дамп). Я, честно говоря, не знаю, что именно означает эта ошибка.

Вот моя функция вставки:

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

Моя ошибка возникает после первого отображения, поэтому я считаю, что причиной является функция вставки. Пожалуйста, помогите мне понять, что я делаю неправильно здесь и как это исправить.

  • 0
    «Я, честно говоря, понятия не имею, что именно означает эта ошибка». - затем Google, прежде чем опубликовать свой вопрос.
Теги:
iterator
doubly-linked-list
insertion

2 ответа

0

Ваш поискIt работает над списком учеников, но все остальное работает над тестовым списком. Если не существует другого кода, добавляемого к списку учеников, он, вероятно, будет пустым, поэтому searchit++ пройдет мимо конца. В любом случае, это будет добавление к студенту, и поэтому не будет отображаться в вашем выпуске

searchit = studentlist.begin();
  • 0
    Ух ты, эта функция работала все это время, я просто забыл изменить studentlist.begin (); to testlist.begin ().
0

Сегментация-ошибка обычно означает, что вы пытаетесь получить доступ к некоторой части памяти, которая не находится под контролем или является ограниченной областью вашей программы. Такие вещи случаются, когда вы пытаетесь получить доступ к недействительным указателям или итераторам разыменования вне границ контейнера.

Поскольку вы сами говорите, что вы можете отображать содержимое testlist, я придерживаюсь того же совета. Темный дал вам: вы, вероятно, ничего не вставляли в studentlist прежде чем его преследовать. Операторы dec/inc итераторов должны иметь доступ к элементу хранения контейнера, чтобы найти следующий в целом. Если итератор недействителен, он, скорее всего, получит доступ к ячейкам памяти вне диапазона.

Или ваша программа сбой в первом цикле?

Во-вторых, почему вы так сложны? Вам не нужно заботиться о предыдущей/следующей обработке списка. Для чего предназначены эти классы контейнеров: абстрагироваться от деталей. Если вы хотите улучшить распределение памяти, для этой цели вы должны указать отдельный распределитель.

  • 0
    Ну, это был отдельный раздел моей программы, чтобы проверить, является ли моя функция вставки причиной проблемы, которую я читаю в своем файле и одновременно сортирую данные в списке. Оказывается, это не проблема, и теперь я в замешательстве.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню