Ваша проблема в том, что вы копируете list
, но не определяете конструктор копирования. Неявно определенный конструктор копирования просто скопирует указатель top
, поэтому вы попытаетесь удалить одну и ту же цепочку узлов дважды.
Копирование происходит, когда вы return *this;
из вашей функции-члена random()
возвращают копию *this
по значению.
Самое короткое исправление - сделать ваш класс не подлежащим копированию, объявив конструктор копирования и оператор присваивания копии в закрытом разделе вашего класса.
private:
list(const list&);
list& operator=(const list&);
После этого вы можете random
вернуть void
, кажется, нет веской причины, по которой он также делает копию.
Тогда вы можете просто назвать это так:
list a;
a.random();
a.show();
Более длинное исправление - сделать list
копируемым, сделав полную реализацию list(const list&)
и list& operator=(const list&)
, которая правильно дублирует все копируемые узлы источника list
.