Список деструкторов без головы? - PullRequest
0 голосов
/ 07 апреля 2020

Я застрял в деструкторе связанного списка для моего класса. Вот что у меня здесь:

LinkedList::~LinkedList()
{
    LinkedList *forward = nullptr;
    LinkedList *current = this;
    //iterate through list, deleting each element as we go
    while (current != nullptr)
    {
            //set next pointer to current's next
            forward = current->next;
            delete current; //delete the current memory
            current = forward; //reset current to next's pointer
    }
}

Когда я запускаю его, я получаю ошибку сегмента. Я хочу удалить только один узел из моего связанного списка. Это возможно? Кроме того, мне не дали указатель «head», как я привык из других списков, поэтому вместо этого я использовал «this», это работает?

Aka -. cpp находит место в связанном списке для удаления, реорганизует следующие указатели вокруг него, а затем удаляет узел (который вызывает этот деструктор)

(когда Я запускаю свою программу с пустым деструктором, она печатается нормально, но, конечно, есть утечки памяти)

Любая помощь приветствуется!

Ответы [ 2 ]

3 голосов
/ 07 апреля 2020

по определению удаление вызовов LinkedList :: ~ LinkedList , поэтому у вас есть несколько (фактически бесконечных) вызовов, потому что l oop вызывает delete , так что вы получаете доступ к уже удаленному элементу с неопределенным поведением

просто выполните

LinkedList::~LinkedList()
{
   if (next != nullptr)
     delete next;
}

или просто

LinkedList::~LinkedList()
{
   delete next; // delete on nullptr does nothing
}

даже лично я предпочитаю сравнивать с nullptr первая

0 голосов
/ 07 апреля 2020

Я спорю с bruno.

Кроме того, когда вы хотите удалить узел, и у вас нет указателя на заголовок, вам нужен двойной связанный список.

Двойной связанный список имеет два указателя на его предыдущий и следующий узел.

когда вам нужно удалить узел, например:

ListNode* p;
if(p->pre)
    p->pre->nxt = p->nxt;
if(p->nxt)
    p->nxt->pre = p->pre;
p->nxt = p->pre = NULL;
delete p;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...