Во-первых, C ++ не является Java или C # и т. Д.Запомни.Тем не менее, вы выделяете новый узел с этим кодом, а затем немедленно слите это распределение со следующей строкой:
Element *el = new Element; // el points to new node
el = l->first; // el points to head sentinal, node from above leaked
Затем вы используете el
для перехода внизсвязанный список, в конечном итоге достигающий, как вы надеетесь, последний узел.Как только это происходит, вы прерываете цикл, но затем делаете это:
delete el; // delete last node in the list
На данный момент вы удалили узел из фактического списка. Первоначальное распределение, выполненное в первой строке, давно прошло(утечка), и теперь вы удалили узел из списка (последний узел), но указатель в списке , который ссылается на этот узел, все еще сохраняет исходный адрес (который теперь не существует;является висящим указателем ).
Повторное выполнение функции достигнет этого несуществующего висячего указателя, попытается следовать за ним и вызвать неопределенное поведение в процессе.
Две вещичтобы исправить это.Во-первых, эта функция не должна изменять список в первую очередь, поэтому не позволяйте этому.Будьте const
правильными и передайте указатель List
как const
.Во-вторых, не выделяйте и не удаляйте память в этой функции вообще .
void afficheList(List const *l) {
Element const *el = l->first;
cout << " {" << el->val << "} ";
while (el->next != nullptr)
{
el = el->next;
cout << " {" << el->val << "} ";
}
cout << " {" << el->next << "} ";
}
Вот и все.в этом коде все еще много других странных / неправильных вещей, но это самая большая проблема с afficheList