Node::~Node()
{
delete Next;
delete Prev;
}
Пока узел уничтожается, он уничтожает своего преемника. Который в свою очередь уничтожает своего предшественника, который уничтожает его преемника, который уничтожает его предшественника, который уничтожает ... Можете ли вы определить проблему? Эта рекурсия бесконечна. Это никогда не заканчивается. Кроме того, поведение не определено, поскольку вы удаляете значение указателя, которое уже удаляется. Как правило, перечислять операции go можно только одним способом. Вам не нужно go возвращаться назад, потому что именно отсюда «взялся» алгоритм.
Даже если мы исправим проблему, не идя в обоих направлениях, другая проблема с рекурсией заключается в том, что она настолько глубока как длина списка. Учитывая, что большинство систем обычно имеют ограниченный размер стека вызовов, это накладывает неявное ограничение на максимальный размер списка. Как правило, операции со связанным списком должны использовать итерацию, а не рекурсию.
Обе проблемы возникают во всех показанных функциях.
Я не пытаюсь выполнить глубокое копирование в классе.
Тогда вы допустили ошибку, так как ваш конструктор копирования и оператор присваивания выполняют глубокое копирование - или, по крайней мере, они выглядят как испорченные версии глубокого копирования.
Если вы хотите поверхностное копирование, тогда вы хотите, что делают неявно сгенерированные операции. И если вы хотите мелкое копирование, то вам также следует хотеть, чтобы указатели не были собственниками, и поэтому хотели бы также использовать неявный деструктор.