如何解决如果要销毁链表和可用内存,是否可以直接将head = NULL放置?
我们为什么需要free()
?将头节点设置为NULL
可以完成类似的工作,不是吗?
解决方法
我们为什么需要free()?
函数free
用于释放动态分配的内存。
将头节点设置为NULL可以完成类似的工作,不是吗?
在指向头节点的指针中放入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
只会更改指针中存储的值。分配的内存没有任何触动。
它们不是等效的。
在C中,如果您显式分配了内存(例如,通过使用malloc
),则需要显式释放内存(通过使用free
)。
如果仅分配head = NULL
,将无法访问链表中的以下元素,但它们的内存仍将被分配-进程仍将保留该内存,并且您将拥有您手上的内存泄漏。
因为C中没有垃圾收集器。这意味着您应该自己收集垃圾。 您在堆上分配的所有内容都必须手动删除。 忘记执行此操作称为内存泄漏。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。