#c #memory-leaks
#c #утечки памяти
Вопрос:
Я создаю связанный список на c и не могу добавить другой узел после 4-го. Когда я использую free (узел), я получаю сообщение об ошибке: free (): недопустимый указатель прерван (сброс ядра) Однако, если я удаляю объявление free (узла), я получаю ошибку сегментации. Я предполагаю, что это какая-то проблема с памятью, но я не могу найти источник проблемы.
Используемые структуры:
struct node
{
int id;
struct process * p;
struct node * next;
};
struct queue
{
struct node * head;
struct node * tail;
};
Функция постановки в очередь, которая должна добавить узел в список:
void enqueue(struct queue * q, struct node * newNode)
{
if(q->tail == NULL)
{
q->head = q->tail = newNode;
return;
}
q->tail = q->tail->next = newNode;
// free statement useful?
free(newNode);
}
Ответ №1:
Оператор free действительно бесполезен.
В этом заявлении:
q->tail = q->tail->next = newNode;
вы присваиваете указатель newnode
двум переменным указателя. Но в следующем утверждении
free(newNode);
вы делаете этот указатель недействительным, поэтому разыменование (или освобождение) указателей, хранящихся в q->tail
, и следующий указатель предпоследнего элемента вашего списка приводит к неопределенному поведению.
Решение состоит в том, чтобы не освобождать указатель, пока в процессе существует действительная ссылка на него.