У меня возникают проблемы с моей функцией вставки, вызывающей ошибку сегментации (основной дамп). Я, честно говоря, не знаю, что именно означает эта ошибка.
Вот моя функция вставки:
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;
}
Моя ошибка возникает после первого отображения, поэтому я считаю, что причиной является функция вставки. Пожалуйста, помогите мне понять, что я делаю неправильно здесь и как это исправить.
Ваш поискIt работает над списком учеников, но все остальное работает над тестовым списком. Если не существует другого кода, добавляемого к списку учеников, он, вероятно, будет пустым, поэтому searchit++ пройдет мимо конца. В любом случае, это будет добавление к студенту, и поэтому не будет отображаться в вашем выпуске
searchit = studentlist.begin();
Сегментация-ошибка обычно означает, что вы пытаетесь получить доступ к некоторой части памяти, которая не находится под контролем или является ограниченной областью вашей программы. Такие вещи случаются, когда вы пытаетесь получить доступ к недействительным указателям или итераторам разыменования вне границ контейнера.
Поскольку вы сами говорите, что вы можете отображать содержимое testlist
, я придерживаюсь того же совета. Темный дал вам: вы, вероятно, ничего не вставляли в studentlist
прежде чем его преследовать. Операторы dec/inc итераторов должны иметь доступ к элементу хранения контейнера, чтобы найти следующий в целом. Если итератор недействителен, он, скорее всего, получит доступ к ячейкам памяти вне диапазона.
Или ваша программа сбой в первом цикле?
Во-вторых, почему вы так сложны? Вам не нужно заботиться о предыдущей/следующей обработке списка. Для чего предназначены эти классы контейнеров: абстрагироваться от деталей. Если вы хотите улучшить распределение памяти, для этой цели вы должны указать отдельный распределитель.