Valgrind 8 байтов внутри блока из 16 свободных

Я пишу код для лабораторной работы в классе, которая представляет собой упражнение в разработке 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)

Спасибо за любую помощь

1

Решение

Вы получаете доступ n после того, как он был удален. Это вызывает неопределенное поведение.

Кроме того, вы не проверяете n->next быть действительным: вы удалили head в первой итерации. Есть ли удаление n причина head быть обновленным? Если нет, то вы достигнете неопределенного поведения снова когда вы достигнете конца связанного списка (который может быть вызван либо deleteв nullptr или еще deleteуказатель мусора (в зависимости от того, что n->next в конце связанного списка указывает на).

1

Другие решения


По вопросам рекламы [email protected]