Поэтому я пытаюсь выполнить реализацию класса List, но при попытке выполнить функцию стирания я продолжаю получать освобождаемый указатель, не была выделена ошибка.
Вот код моей функции erase():
template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop)
{
while (start<= stop) {
ListIterator<T> * temp = &start;
++temp;
delete start.currentLink;
start.currentLink = temp->currentLink;
}
}
Теперь я уже тестировал свой класс ссылок и классов, и они работают, я сделал все остальное, как insert() и push_back(). Я не смог узнать, где я неправильно распределяю память. это любые идеи, которые могли бы указать мне в правильном направлении.
В соответствии с вашей реализацией вы освободите одно и то же пространство памяти в третьей итерации цикла while (i, e, если вы освобождаете более 2 элементов, тогда вы, вероятно, получите сообщение об ошибке).
template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop)
{
while (start<= stop) {
ListIterator<T> * temp = &start;
Line:1 ++temp;
Line:2 delete start.currentLink;
Line:3 start.currentLink = temp->currentLink;
}
}
Рассмотрим Listclass= {A, B, C} с A.link = 100, B.link = 101 и C.link = 102
1-я итерация:
Line1: временные точки для B
Line2: вы бесплатно 100
Line3: вы назначаете A.link = temp.link(i, e B.link) = 101
2-я итерация:
Line1: темп по-прежнему указывает на B
Line2: вы бесплатно 101
Line3: вы назначаете A.link = temp.link(i, e B.link) = 101, который уже освобожден
Третья итерация
Line1: temp все еще указывает на тот же самый проклятый B
Line2: вы освобождаете 101, который уже освобожден <--- возможно, gdb жалуется здесь
Easy Fix:
template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop)
{
ListIterator<T> * temp = &start;
while (start<= stop) {
++temp;
delete start.currentLink;
start.currentLink = temp->currentLink;
}
}
Лучшее исправление:
template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop)
{
ListIterator<T> * temp = &start;
while (start<= stop) {
delete start.currentLink;
start++;
}
temp->currentLink = start.currentLink;
}
Хотя я запутался относительно функции стирания, поскольку последний элемент 2 будет иметь тот же currentLink (насколько я могу догадаться из вашей реализации).
Надеюсь это поможет.