当用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函数是无法释放内存的。这点已经经过验证。