永发信息网

求问链表的内存释放问题

答案:6  悬赏:80  手机版
解决时间 2021-11-23 01:51
  • 提问者网友:美人性情
  • 2021-11-22 08:50
求问链表的内存释放问题
最佳答案
  • 五星知识达人网友:街头电车
  • 2021-11-22 09:23
这段小程序是正确的:
temp指向头第一个节点;
让node指向下一个节点;
释放temp所指向的第一个节点;
再重复;
问题出在你对指针的认识上:
free(temp); 所指向的一个节点空间*temp 被释放;temp值虽是无用的了,但并影响下面;
temp=node; temp与node同时指向下一个将要释放的节点上,这里完全正确;
你的认识问题就出在这!!!
解释二: 释放后,不需要 temp=NULL; 虽temp是野指针,你只要不去访问 *temp单元就没事。
-----------------------------------------------------------------------------
我发现你指针的概念很乱!
原话1:刚释放的节点又指向了它的下一个节点,这跟没释放时有什么区别?链表的前后连接关系完全没有改变,更没有被消灭! --> 这是我的第一个疑问,希望高手给予指点。
temp 指向的单元 *temp释放了, 但temp本身仍存在的,只不过野指针罢了,不要混淆:*temp与temp的概念区别;
全部回答
  • 1楼网友:你哪知我潦倒为你
  • 2021-11-22 13:20
使用free();释放函数就行了
  • 2楼网友:雾月
  • 2021-11-22 12:56
可以建立一个函数专门释放内存
  • 3楼网友:妄饮晩冬酒
  • 2021-11-22 12:15
[temp=node表示刚刚被释放的temp(指向随意)现在又指向了node(这时的node正是下一个呆释放的节点)]这里没有错。
[换句话说,刚释放的节点又指向了它的下一个节点,这跟没释放时有什么区别?]temp只是一个指针变量而已,它存储的只是地址,而非链表项。所以这句话有点问题。
[链表的前后连接关系完全没有改变,更没有被消灭!] 这要看你怎么理解了。释放一个链表主要的目的是为了内存的从新利用。free掉的内存里的内容是没有改变的(基本上是这样的)。所以里面的内容还是原来的。但是,这些内容是没有保护的,处于随时可用的状态(可用是指这块内存,而非里面的内容)。
第二问:单个空间的定义是什么呢?int大小的空间,还是char大小呢,还是指针类型本身的空间大小。不同的指针类型(数据类型),free释放的空间大小是不同的。

[比如告诉我链表需要一个节点一个节点地free。]我还真的想这么说的。链表各个节点的内存地址不一定是连续的,而且你也应当把它当成是不连续的,这是链式结构和数组的本质上的不同,所以了,各个节点之间的地址不连续,也就只能一个一个去free了。不过你也可以写个函数专门来释放链表,这样不就有了可以释放链表的free函数了吗。free使用来对应malloc的。你写个list_free来对应list就好了。别纠结在这种地方了。

哦,如果你要完全清除的话用memset函数在free前将节点内容置0就好了(全部内容,包括next指针)。
小子是大一还是大二呢
  • 4楼网友:第四晚心情
  • 2021-11-22 11:26
你对指针的理解有问题,temp只是个临时变量,你所说的temp=node表示刚刚被释放的temp(指向随意)现在又指向了node,不对,此时temp是指向随意,但是temp=node只是让temp指向node而已,相当于初始化一个指针,这里可以看出你对指针的理解有问题。另外如果要temp=NULL ,应加在在free之前。
  • 5楼网友:舍身薄凉客
  • 2021-11-22 09:49
1、temp是一个给定类型的指针,执行temp = node;的操作,是将指针temp指向node指向的内容,只要类型匹配,无论temp事先指向哪儿,经过赋值操作后,就会无条件地指向给定的地方。
2、经过给出代码的释放操作,会释放所有结点占用的动态内存,包括头结点head,既然结点占用的内存已经还给系统了,该结点也就不复存在了,是否执行head = NULL操作,要看编程这自己的意愿,个人意见是,没必要多此一举,既然自己亲手释放了,再去操作不存在的结点就是“人”出问题了,而不是“野”指针的过错。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯