Где освободить (бесплатно)
Изучая учебник по связанным спискам на C. Я скомпилировал этот код и провел его через valgrind. Это показывает 4 распределения и 0 освобождений, которые я понимаю. Мне нужно знать, как правильно позвонить free()
освободить.
Пример кода: llist2.c
// linked list: inserting at the n'th position
#include "stdio.h"
#include "stdlib.h"
typedef struct Node
{
int data;
struct Node* next;
} Node;
Node* head;
void Insert(int data, int n)
{
Node* temp1 = malloc(sizeof(Node));
temp1->data = data;
temp1->next = NULL;
if(n==1) { // list is empty, set next to head, initially NULL.
temp1->next = head;
head = temp1;
return;
}
Node* temp2 = head;
for(int i = 0; i < n-2; i+=1) {
temp2 = temp2->next;
}
temp1->next = temp2->next;
temp2->next = temp1;
}
void Print() {
Node* temp = head;
while(temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main (int argc, char *argv[])
{
head = NULL;
Insert(2,1);
Insert(3,2);
Insert(4,1);
Insert(5,2);
Print();
return 0;
}
2 ответа
Решение
Вам нужно создать функцию для освобождения вашего списка.
void freelist(Node* head)
{
Node *next,*curr;
curr = head;
while (curr != NULL)
{
next = curr -> next;
free(curr);
curr = next;
}
}
Вы можете назвать это в основном в конце.
int main (int argc, char *argv[])
{
// Other code
freelist(head);
head = NULL;
return 0;
}
Вы должны освободить после завершения использования того, что выделено. Следуйте списку и освободите.
Например, вы можете вызвать эту функцию Deallocate()
после звонка Print()
,
void Deallocate() {
Node* temp = head;
while(temp != NULL) {
Node* next = temp->next;
free(temp);
temp = next;
}
head = NULL;
}
Обратите внимание, что вы не можете делать это так
void Deallocate_bad() {
Node* temp = head;
while(temp != NULL) {
free(temp);
temp = temp->next; /* undefined behavior */
}
head = NULL;
}
потому что вы не можете получить доступ temp->next
после освобождения temp
,