《你的月亮我的C》(四):释放内存,free的那些事

为什么要释放内存?因为用malloc分配的内存(格式:int*a=(int*mallocn*sizeofint));)会一直存在在那里,它不会自动释放,内存会在程序退出时被回收,也可以用free来显式地释放所有分配的内存。今天我们就来聊聊free的那些事。

用malloc动态分配的内存被释放后就不能再使用了?是的,否则很容易出现问题,因为不小心使用了已释放的内存是很经常出现的事,比如这个:释放单链表的代码中:

第24-26行,要避免这个问题,可以使用一个临时变量来每次保存下一个结点。

 

用free是释放申请得到的空间的首地址也就是比如我们用malloc函数申请了一块地址给指针a,然后对a进行了a++,之后再用free来把a还给系统,这是不行的。我们可以来试一下这件事情:

结果程序崩溃了,因为指针a所指的那块要被释放的内存不是之前malloc函数申请得来的,a所指的地址已经改变了。

我们还可以再这样试一下,如果我们在第12行让a指向i的地址,然后把a释放:

同样我们的编译通过了,但运行时程序崩溃了。

 

malloc申请了一块内存,用free释放后,系统的内存占用率并没有变回去,怎么回事?这里引用Steve Summit:“多数malloc/free的实现并不把释放的内存返回操作系统,而是留着供同一程序的后续malloc( )使用。”。

 

我们必须在退出程序之前free掉所有malloc申请得来的内存吗?不必要这么做,但这是一个好的习惯。为什么说不必要这么做?因为操作系统会在程序退出之后(释放)回收掉程序的内存,而且上一段也说到,多数free的实现并不把释放的内存返回操作系统,而是留着供同一程序的后续malloc( )使用。所以显式地释放所有的内存并不是必要,因为很容易出现问题,对于新手来说,常常忘记free,对于老司机来说,找不准free的时机,所以容易出错。

 

在一个函数中声明一个局部指针,用malloc为这个局部指针分配内存,之后还需要用free来显式释放内存吗?要。指针变量和指针指向的对象是两个不同的东西。一个局部变量在函数结束返回后是会被释放,但对于指针变量来说,指针被释放了,但指针指向的对象还在那里,因为用malloc为其申请了内存,所有在显式调用free释放它之前,它会一直占用空间。所以一个好的习惯就是,每一个malloc( )调用,都有一个对应的free( )调用来释放分配的内存。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值