Вызов деструктора после мелкого копирования приводит к ошибке «Прервать прерывание: 6» - PullRequest
0 голосов
/ 21 апреля 2020

Итак, у меня есть самореализующийся класс связанного списка. Для конструктора копирования, который делает «глубокую копию» или, по сути, копию связанного списка. Но для оператора присваивания я в основном сделал это

// assignment operator
linked_list& linked_list::operator=(const linked_list& L){

    // check for self assignment 
    if(this != &L){

        this->head=L.head;
        this->sz=L.sz;
    }

   return *this;    
}

. Это делает "мелкую копию", поэтому, когда я создаю новый связанный список b и указываю на него, изменения в b будут отражены в ,

Но теперь проблема в том, что когда я вызываю деструктор, который динамически распределяет узлы, поскольку оба они указывают на один и тот же объект, и один из деструкторов вызывается раньше другого, я получаю следующее сообщение об ошибке .

edit.out (3537,0x106bcbdc0) mallo c: *** ошибка для объекта 0x7fa430c018f0: освобожденный указатель не был выделен

edit.out (3537,0x106bcbdc0 ) mallo c: *** установить точку останова в malloc_error_break для отладки прерывания прерывания: 6

Я использовал lldb для проверки любых решений, но я не могу определить, какие объекты будут разрушать объекты называется первым, и как я могу предотвратить повторный вызов.

1 Ответ

2 голосов
/ 21 апреля 2020

Если ваш конструктор копирования и деструктор работают должным образом (имеется в виду нет ошибок), то оператор присваивания может быть легко написан с использованием идиомы copy / swap :

#include <algorithm>
//...
linked_list& linked_list::operator=(const linked_list& L)
{
    if (this != &L)
    {
        linked_list temp(L);
        std::swap(head, temp.head);
        std::swap(sz, temp.sz);
    }
    return *this;
}

Я предполагаю, что head и sz являются единственными членами. Если у вас есть другие участники, вам также нужно swap их.

В двух словах, способ работает так, что вы делаете копию переданного linked_list. Затем вы просто меняете внутреннее содержимое текущего объекта на внутреннее содержимое временной копии. Затем временная копия разрушается вместе со старыми внутренностями.

...