Я пишу код для лабораторной работы в классе, которая представляет собой упражнение в разработке OOD с использованием кругового связанного списка. Это просто означает, что некоторые ключевые функции, которые используются, мне недоступны. Тем не менее, я в основном сбит с толку, потому что, хотя мой драйвер имитирует тот, что написан профессором, я все еще получаю ошибку mchk в названии. Вот код, на который он ссылается
{
int nNodesFreed{0};
node* n{head};
for(; n!= head || ! nNodesFreed; n = n->next) {
delete n;
nNodesFreed++;
}
cout << "# nodes freed: " << nNodesFreed << endl;
}
В похожем вопросе я обнаружил, что проблема может заключаться в том, что я пытаюсь получить доступ к уже освобожденной памяти. И.Е. как можно n = n-> далее, если n больше не существует. Я попытался переключиться на цикл while, используя текущий и следующий указатель, но это усугубило проблему. Код прекрасно работает в версии задания моего профессора, в которой я не реализовал функции, которые мне нужны.
Точная ошибка, которую я дал:
Invalid read of size 8
at 0x400D8A: main (lab04.cpp:28) // this references the for loop
Address 0x5a02048 is 8 bytes inside a block of size 16 free'd
at 0x4C28FAC: operator delete(void*)
by 0x400D81: main (lab04.cpp:29)
Спасибо за любую помощь
Вы получаете доступ n
после того, как он был удален. Это вызывает неопределенное поведение.
Кроме того, вы не проверяете n->next
быть действительным: вы удалили head
в первой итерации. Есть ли удаление n
причина head
быть обновленным? Если нет, то вы достигнете неопределенного поведения снова когда вы достигнете конца связанного списка (который может быть вызван либо delete
в nullptr
или еще delete
указатель мусора (в зависимости от того, что n->next
в конце связанного списка указывает на).