c++ free()函数和malloc()函数的使用

malloc与free要对应的,如果是new分配的只能用delete而不是free进行释放。

int  a=10; int  *arr=(int *) malloc(sizeof (int)* a);

截取一段简单代码说明:

int min_z=1;
for(int z=min_z; z<=max_z; z++)
{
	int *vert_x=(int *)malloc(sizeof(int) *NN_z[z-min_z]);
}
free(vert_x)
1、free只是释放了malloc所申请的内存,并不改变指针的值;free的是vert_x所指向地址的内存。free只是释放了指针所指向地址的空间,本质上就是做了一些标记而已,所以指针及空间内容都还是存在的,只不过有隐患罢了。

2、free(vert_x)释放了vert_x指示的内存空间,vert_x这个指针变量本身仍然存在。这就是悬垂指针问题

3、由于指针所指向的内存已经被释放,所以其它代码有机会改写其中的内容,相当于该指针从此指向了自己无法控制的地方,也称为野指针;
4、为了避免失误,最好在free之后,将指针指向NULL。

比喻的形象说法:

内核通过一个红黑树来记录了空闲的内存,malloc就是从树中查找一块大小适合的内存并把地址给你,然后把这个节点从树中摘除,避免被别人分配到产生冲突。这个内存现在归你一个人用了。
free函数是把你的这个内存重新放回到红黑树中,让别人可以申请到这个内存。从逻辑上来说,你现在不能在使用这个内存了,因为它已经不属于你。但是系统的实现上目前没有做到,所以你还是能访问这个地址。
另外,系统也不会帮你覆盖内存中的数据,因为做这一个操作浪费时间,没有必要。
打一个简单的比方。你租了一套房子,后来租期到了,房子回到房东手里,或者又转租给别人。但是你拿着原来的钥匙还是能进入那套房子,虽然这个是不合法的。----而且你进入这套房子后,里面不一定就一定有变化。(^_^)

办法:1、将对应的内存块标记为可用(即可被本进程或其它进程申请占用)。

         2、在free之后,将指针指向NULL

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值