Прежде всего: я действительно, очень надеюсь, что это домашнее задание, назначенное вам для того, чтобы понять двусвязный список. В противном случае нет причин использовать это вместо std::list
. С этим из пути:
Нет, delete this
в dtor всегда неверен, так как dtor вызывается, когда this
находится в состоянии удаления.
Также пока
delete temp;
temp = temp->next();
между прочим может работать, это, безусловно, неправильно, поскольку, когда вы пытаетесь получить доступ к temp->next()
, temp
уже удален, поэтому вы должны вызвать функцию-член для него. Это вызывает так называемое «неопределенное поведение». (Короче говоря: он может делать то, что вы хотите, но он также может терпеть неудачу всегда или время от времени, или только тогда, когда пятница, 13-е, сталкивается с новолунием. Это также может вызвать на вас очень неприятных носовых демонов. )
Обратите внимание, что вы можете решить обе проблемы, удалив следующий узел в dtor вашего узла:
Node::~Node()
{
delete next();
}
Таким образом, ваш список dtor тоже становится очень простым:
DoublyLinkedList::~DoublyLinkedList()
{
delete first();
}
Мне кажется, для этого и были изобретены dtors, поэтому, за исключением того факта, что в наше время никто больше не должен писать свои собственные типы связанных списков, мне кажется, что это решение C ++ вашей проблемы ,