Я пытаюсь реализовать класс одиночно связанных списков в C++. Я перегрузил оператор присваивания, чтобы клонировать список. Сам клонирование, похоже, работает нормально, но программа вылетает во время удаления клонированного списка, что заставляет меня подозревать, что что-то не так во время процедуры копирования.Клонирование односвязного списка с использованием перегруженного оператора присваивания
Любая помощь очень ценится. Вот код для перегруженного оператора =:
DLList& DLList::operator=(const DLList& iList)
{
Node *t = iList.head();
while(t != NULL)
{
push(t->data);
t = t->next;
}
return *this;
}
Вот код для операции нажимной:
void DLList::push(int data)
{
Node *n = new Node;
n->data = data;
n->next = NULL;
//n->random = NULL;
n->next = _head;
_head = n;
//cout << "_head" <<_head->data<< "head->next" << (_head->next ? _head->next->data : 0)<<endl;
}
Вот основной код (где авария происходит):
DLList *d = new DLList();
d->push(10);
d->push(20);
d->push(30);
d->push(40);
d->setRandom();
d->display("Original list"); // Displays the original list fine
DLList *d1 = new DLList();
d1 = d;
d1->display("Cloned list"); //Displays the cloned list fine
delete d; // works fine
delete d1; // Crashes here due to segmentation fault, invalid pointer access during delete called as part of destructor)
Код для деструктора (если это помогает):
~DLList()
{
while(_head != NULL)
{
Node *temp = _head;
_head = _head->next;
delete temp; // crashes here during first iteration for the cloned list
}
}
подозревают, что проблема находится в операторе копирования. вам нужно будет сделать копии каждого объекта, принадлежащего этому списку. вы можете показать код? –
Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –
Другая проблема (которую не затронули ответы) заключается в том, что ваш оператор присваивания присоединяется к текущему списку вместо его замены. – molbdnilo