如果我想销毁链表和释放内存,我不能直接放 head=NULL 吗?
Can't I directly put head=NULL if i want to destroy linked list and free memory?
为什么我们需要 free()
?将头节点设置为 NULL
可以起到类似的作用,不是吗?
因为 C 中没有垃圾收集器。这意味着您应该自己收集垃圾。
您在堆上分配的所有内容都必须手动删除。
忘记做就叫内存泄漏.
它们不等价。
在 C 中,如果显式分配内存(例如,使用 malloc
),则需要显式释放它(使用 free
)。
如果你只是赋值head = NULL
,你将无法访问链表中的以下元素,但它们的内存仍会被分配——进程仍会持有这块内存,而你'你手上会有内存泄漏。
Why do we need free()?
函数free
用于释放动态分配的内存。
Putting the head node as NULL does similar work, doesn't it?
将 NULL 放入指向头节点的指针中并不会释放列表中所有动态分配的内存,既不会为头节点也不会为其他节点释放内存。这会导致丢失第一个动态分配节点的地址,结果你会得到大量内存泄漏,因为内存变得不可访问(但未释放)..
考虑以下演示程序。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *p1 = malloc( sizeof( int ) );
*p1 = 10;
printf( "*p1 = %d\n", *p1 );
int *p2 = p1;
p1 = NULL;
printf( "*p2 = %d\n", *p2 );
free( p2 );
return 0;
}
它的输出是
*p1 = 10
*p2 = 10
在程序中,为int
类型的对象动态分配了内存,分配内存的地址已分配给指针p1
。
将NULL
分配给指针p1
后,分配的内存地址不再存储在该指针中。
所以如果地址没有分配给第二个指针p2
那么分配内存的地址将永远丢失,我们无法释放内存。
只有在指针中有地址的副本 p2
我们才能释放分配的内存。
因此将指针设置为 NULL
只会更改存储在指针中的值。分配的内存不会以任何方式被触及。
为什么我们需要 free()
?将头节点设置为 NULL
可以起到类似的作用,不是吗?
因为 C 中没有垃圾收集器。这意味着您应该自己收集垃圾。 您在堆上分配的所有内容都必须手动删除。 忘记做就叫内存泄漏.
它们不等价。
在 C 中,如果显式分配内存(例如,使用 malloc
),则需要显式释放它(使用 free
)。
如果你只是赋值head = NULL
,你将无法访问链表中的以下元素,但它们的内存仍会被分配——进程仍会持有这块内存,而你'你手上会有内存泄漏。
Why do we need free()?
函数free
用于释放动态分配的内存。
Putting the head node as NULL does similar work, doesn't it?
将 NULL 放入指向头节点的指针中并不会释放列表中所有动态分配的内存,既不会为头节点也不会为其他节点释放内存。这会导致丢失第一个动态分配节点的地址,结果你会得到大量内存泄漏,因为内存变得不可访问(但未释放)..
考虑以下演示程序。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *p1 = malloc( sizeof( int ) );
*p1 = 10;
printf( "*p1 = %d\n", *p1 );
int *p2 = p1;
p1 = NULL;
printf( "*p2 = %d\n", *p2 );
free( p2 );
return 0;
}
它的输出是
*p1 = 10
*p2 = 10
在程序中,为int
类型的对象动态分配了内存,分配内存的地址已分配给指针p1
。
将NULL
分配给指针p1
后,分配的内存地址不再存储在该指针中。
所以如果地址没有分配给第二个指针p2
那么分配内存的地址将永远丢失,我们无法释放内存。
只有在指针中有地址的副本 p2
我们才能释放分配的内存。
因此将指针设置为 NULL
只会更改存储在指针中的值。分配的内存不会以任何方式被触及。