malloc和free

来源:互联网 发布:江苏远洋数据有限公司 编辑:程序博客网 时间:2024/06/06 03:01

  当用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