变量用delete释放,数组用delete[]释放,指针的类型不能改变.对于一些简单的情况(所有成员都是基本数据类型,没有析构函数),可以直接用delete释放.
例:
structNODE
{
intidata;
doubleddata;
}node[100];
//释放空间
delete[]node;
//所有的数组类型释放空间都这样写
扩展资料
C语言数组
所有的数组都是由连续的内存位置组成.最低的地址对应第一个元素,最高的地址对应最后一个元素.
C管理内存大致可以理解为两种,分配在栈上的,一个是分配在堆上的.
临时变量,动态变量,分配在栈上,运行完,直接弹出栈,就没了.
分配在堆上的内存,释放的时候,基本上可以理解为,指针不指这里了.也就失去了对这块内存的控制.其实所谓的释放.字面意思容易让人理解错.
有些机器有些操作系统,会在释放的时候清空这段内存,但是这种做法效率不高,但是安全,很少有机器这么做,多数都是所谓释放,就是不让你控制这块内存了而已.
首先你要搞明白,List本身已经被定义为Node*类型,所以呢List*实际上是一个二级指针
你的疑问中,如果改成*list = p-next,运行应该是可以通过的.但是不推荐这样做.为什么呢?
这就要先理解FreeMem这个函数,为什么用List*做参数,而不是List.如果只是为了释放链表内存,只要一级指针就可以了,用二级指针只会增加代码的复杂程度,降低可读性.二级指针的作用就在于,在这个函数内,你可以修改这个函数的主调函数(比如main函数)中链表头结点的指针值.在这个例子中,显而易见的就是,链表释放了内存,head指针应该是NULL.
如果上面这段话你能明白的话,那么我的建议是,使用你问题中"可行"的那段代码,并添加*list = NULL;在结尾.或者这样做也可以达到同样的效果:传入参数使用一级指针,配合函数的返回值来保证功能的完整性,这样调用的时候需要诸如head = FreeMem(head);以达到释放内存后置head指针为NULL的目的.
看了楼主的追问,看来楼主对二级指针的理解还不太到位.其实mornslit兄的解释已经说清楚你这种写法的问题在哪了.我再帮你分析下:
pt = p-next;
*list = p-next;
这两种写法,效果是一样的,都是保存了下一个节点的地址(也就是p-next的值)
list = p-next;
这种写法,是保存了p这个节点的next指针的地址,通过*运算,看似可以获取next的值,其实在p被free掉之后,next指针本身的值已经不能保证了
简言之,你错在哪了:p-next是下一个节点的地址,是与p共存亡的,你可以保存p-next的值,但不应该保存它的地址
说实话,还是建议楼主先搞清楚为什么要用二级指针,杀鸡用牛刀未必一定好~
以上就是土嘎嘎小编为大家整理的c语言中释放资源函数相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!