Реализация класса List Ошибка выделения памяти с указателем

0

Поэтому я пытаюсь выполнить реализацию класса 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(). Я не смог узнать, где я неправильно распределяю память. это любые идеи, которые могли бы указать мне в правильном направлении.

Теги:
linked-list
memory-management
erase

1 ответ

0
Лучший ответ

В соответствии с вашей реализацией вы освободите одно и то же пространство памяти в третьей итерации цикла 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 (насколько я могу догадаться из вашей реализации).

Надеюсь это поможет.

  • 0
    Спасибо, я думаю, что получил это сейчас, поэтому я пытался получить доступ к памяти, которую я уже освободил. Я буду помнить об этом, и на самом деле вы только что показали мне новый способ отладки кода!
  • 0
    Добро пожаловать. Если ответ решит ваш вопрос, примите его как ответ.

Ещё вопросы

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