Can';如果我想销毁链表并释放内存,我是否直接将head=NULL?
为什么我们需要Can';如果我想销毁链表并释放内存,我是否直接将head=NULL?,c,linked-list,free,singly-linked-list,C,Linked List,Free,Singly Linked List,为什么我们需要free()?将head节点设置为NULL也有类似的作用,不是吗?因为C中没有垃圾收集器。这意味着您应该自己收集垃圾。 您在堆上分配的所有内容都必须手动删除。 忘记这样做被称为内存泄漏。它们不是等价的 在C语言中,如果显式分配内存(例如,通过使用malloc),则需要显式释放内存(通过使用free) 如果您只分配head=NULL,您将无法访问链接列表中的以下元素,但它们的内存仍将被分配-该进程仍将保留此内存,并且您将面临内存泄漏 为什么我们需要免费的 函数free用于释放动态分配
free()
?将head节点设置为NULL
也有类似的作用,不是吗?因为C中没有垃圾收集器。这意味着您应该自己收集垃圾。
您在堆上分配的所有内容都必须手动删除。
忘记这样做被称为内存泄漏。它们不是等价的 在C语言中,如果显式分配内存(例如,通过使用
malloc
),则需要显式释放内存(通过使用free
)
如果您只分配head=NULL
,您将无法访问链接列表中的以下元素,但它们的内存仍将被分配-该进程仍将保留此内存,并且您将面临内存泄漏
为什么我们需要免费的
函数free
用于释放动态分配的内存
将head节点设置为NULL也有类似的作用,不是吗
在指向head节点的指针中输入NULL不会释放列表中所有动态分配的内存,也不会释放head节点或其他节点的内存。这将导致丢失第一个动态分配节点的地址,因此,由于内存变得不可访问(但未释放),将导致大量内存泄漏
考虑以下演示程序
#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;
}
在程序中,为int
类型的对象动态分配了内存,分配内存的地址分配给指针p1
将NULL
分配给指针p1
后,分配内存的地址不再存储在此指针中
因此,如果没有将地址分配给第二个指针p2
,则分配内存的地址将永远丢失,我们无法释放内存
只有在指针p2
中有地址副本,我们才能释放分配的内存
因此,将指针设置为
NULL
只会更改指针中存储的值。分配的内存不会以任何方式被触及。否。它只是将指针设置为NULL。但它不会自动释放您先前分配的内存。我们为什么要卖掉房子?我可以删除我手机上的地址,不是吗?你可以使用valgrind查看你的程序何时无法频繁调用free()
。在进程结束之前,它将是为您的进程保留的死亡内存。另请参阅通过解除限制释放内存仅适用于具有自动析构函数或垃圾收集器的语言,或者如果您自己进行内存记帐,如果分配了节点和数据,则需要在销毁指向它们的指针之前释放每个节点和数据。这并不能回答问题。有人问“为什么我必须免费打电话”不知道“收集垃圾”是什么意思。“你必须自己收集垃圾”对他们来说是一句毫无意义的话。祝贺你达到20万,弗拉德@罗伯茨支持斯莫尼卡塞利奥感谢您的祝贺。:)
*p1 = 10
*p2 = 10