У меня есть односвязный круговой связанный список, и я пишу деструктор для удаления всех узлов. Деструктор сначала отсекает голову от остальной части, чтобы предотвратить бесконечную циркуляцию, а затем я пропускаю через список l oop и удаляю все узлы, в конце концов, l oop возвращается к голове и удаляет ее. В программе я проверяю, чтобы убедиться, что указатель на узлы не равен NULL, и я запустил отладчик, и он показывает, что он равен NULL в точке, которая должна завершить l oop, но вместо этого l oop продолжается и работает в нераспределенной памяти. Вот мой код:
node<T> *cur = head;
node<T> *nxt = head->next;
if (nxt) cur->next = nullptr;
cur = nxt;
// walk through the list and delete nodes
while (cur) {
cur = cur->next;
delete cur;
}
РЕДАКТИРОВАТЬ: Изменен код на
node<T> *cur = head;
node<T> *nxt = head->next;
if (nxt) cur->next = nullptr;
cur = nxt;
// walk through the list and delete nodes
while (cur) {
nxt = cur->next;
delete cur;
cur = nxt;
}
РЕДАКТИРОВАТЬ 2: Еще раз изменен код для обработки края случаев, такая же проблема все еще возникает.
if (head == NULL) return;
else if (head->next == head) delete head;
else {
node<T> *cur = head;
node<T> *nxt = head->next;
cur->next = nullptr;
cur = nxt;
while(cur) {
nxt = cur -> next;
delete cur;
cur = nxt;
}
}