malloc和free

  当用free函数释放malloc或者calloc申请的内存的时候

 

 malloc(n,sizeof(int))

  等释放的时候发现,释放的内存其实是大于n的,为什么是这样呢?

  原来在一开始malloc申请内存的时候,申请的内存大小就比需要的打,在所申请内存的一开始记录着内存块的管理信息。也就是说malloc所申请的内存空间实际上有两个性质不同的空间,一个是用来记录管理信息的空间,一个是真正用来记录数据的空间。在C语言中,管理信息的空间是用结构体进行表示的

struct mem_control_block{
    int is_available;
    int size;
    ...   
}

    而free()函数释放内存空间的时候,这两种内存空间是都要释放的,free函数的关键代码如下面所示

void free(void *ptr)  
    { 
            struct mem_control_block *free; 
            free = ptr - sizeof(struct mem_control_block); 
            free->is_available = 1; 
            return; 
    }

    最重要的是第二行,可以看出,free(ptr)中ptr实际指向的是内存空间,但是在free函数中,ptr要倒回到内存管理空间,从内存管理空间开始释放内存。从这我们也可以看出一定要保证ptr是指向数据内存空间的首地址,因为如果地址改变,free函数是无法释放内存的。这点已经经过验证。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值