释放链表
Free a linked list
我在正确释放链接列表时遇到问题。我真的不知道,如何用 head 和 current 制作它...
typedef struct list{
int info;
struct list *link;
} Node;
Node *_getnode (){
return((Node *) malloc (sizeof (Node)));
}
int main() {
Node *s = _getnode();
s -> link = NULL;
Node *t = s;
int c;
while (1) {
printf("\n\t Enter number : ");
scanf ("%d", &s -> info);
printf ("\n\t Continue? ");
__fpurge (stdin);
c = getchar ();
if (c == 'N' || c == 'n'){
s -> link = NULL;
break;
}
s -> link = _getnode ();
s = s -> link;
}
s = t;
free(s);
free(t);
putchar('\n');
return (0);
}
当我只输入一个数字时,valgrind 说没有内存泄漏。但除此之外还有。我明白,我不仅要释放第一个节点,但我不知道如何释放。
这样试试
void free_list(Node *head)
{
Node *s;
Node *n;
if (head == NULL) /* passing `NULL' should be ok */
return;
for (s = head ; s != NULL ; s = n)
{
n = s->link;
free(s);
}
}
您可以在创建列表的方式中看到一个明显的缺陷。
首先,行
free(s);
free(t);
是多余的,因为您已经在上一行中分配了 s = t;
。
内存泄漏的发生是因为您只在头指针上使用了free
,而不是链表中的所有节点。所以理想情况下,您应该遍历所有节点并释放分配给每个节点的内存,您的代码应该如下所示:
while(s != NULL)
{
t = s->link;
free(s);
s = t;
}
首先,请初始化节点,以便程序可以正确判断列表的结尾。
Node *_getnode (){
Node* buffer = malloc (sizeof (Node));
if (buffer == NULL) exit(1);
buffer->info = 0; /* not important */
buffer->link = NULL; /* this is important */
return buffer;
}
然后,一个一个释放节点。
void free_nodes (Node* head){
while(head != NULL){
Node* next = head->link;
free(head);
head = next;
}
}
未测试,将 t
传递给此 free_nodes
应该有效。
我在正确释放链接列表时遇到问题。我真的不知道,如何用 head 和 current 制作它...
typedef struct list{
int info;
struct list *link;
} Node;
Node *_getnode (){
return((Node *) malloc (sizeof (Node)));
}
int main() {
Node *s = _getnode();
s -> link = NULL;
Node *t = s;
int c;
while (1) {
printf("\n\t Enter number : ");
scanf ("%d", &s -> info);
printf ("\n\t Continue? ");
__fpurge (stdin);
c = getchar ();
if (c == 'N' || c == 'n'){
s -> link = NULL;
break;
}
s -> link = _getnode ();
s = s -> link;
}
s = t;
free(s);
free(t);
putchar('\n');
return (0);
}
当我只输入一个数字时,valgrind 说没有内存泄漏。但除此之外还有。我明白,我不仅要释放第一个节点,但我不知道如何释放。
这样试试
void free_list(Node *head)
{
Node *s;
Node *n;
if (head == NULL) /* passing `NULL' should be ok */
return;
for (s = head ; s != NULL ; s = n)
{
n = s->link;
free(s);
}
}
您可以在创建列表的方式中看到一个明显的缺陷。
首先,行
free(s);
free(t);
是多余的,因为您已经在上一行中分配了 s = t;
。
内存泄漏的发生是因为您只在头指针上使用了free
,而不是链表中的所有节点。所以理想情况下,您应该遍历所有节点并释放分配给每个节点的内存,您的代码应该如下所示:
while(s != NULL)
{
t = s->link;
free(s);
s = t;
}
首先,请初始化节点,以便程序可以正确判断列表的结尾。
Node *_getnode (){
Node* buffer = malloc (sizeof (Node));
if (buffer == NULL) exit(1);
buffer->info = 0; /* not important */
buffer->link = NULL; /* this is important */
return buffer;
}
然后,一个一个释放节点。
void free_nodes (Node* head){
while(head != NULL){
Node* next = head->link;
free(head);
head = next;
}
}
未测试,将 t
传递给此 free_nodes
应该有效。