free在释放内存的时候,为什么不需要指定内存的大小?
这个是学生前两天面大疆的时候,面试官提出的问题。
这个问题不难,比起malloc申请内存的过程要简单的多。
malloc在申请内存的时候,需要指定内存的大小,申请成功则返回这块内存的地址,但是free的时候,只需要指定释放的内存的起始地址,系统就知道从这个地址开始需要释放多少个字节。
char *ptr = (char *)malloc(128); free(ptr);原因也很简单,malloc在申请内存的时候,申请到的内存往往比我们需要的内存大,也就是在我们能使用的内存前面会多出一块内存存放头部信息,这个信息就包含了接下来这块内存的大小。
大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。
当然,这个所谓的头部信息,不同的平台存放的内容也不太一样。
《C程序设计语言》这本书中就提到了一种结构:
union header_t { struct { unsigned size; union header_t *next; }; long align; };联合体中嵌套了结构体,结构体中包含了两个成员:一个是指向下一个头部的指针,一个表示堆内存的大小。
char *ptr = (char *)malloc(128); memset(ptr - 16, 0, 16); free(ptr);先用malloc申请一块内存,然后从返回的地址开始,向前16个字节,全部清空成0,然后再用free释放内存。
全部0条评论
快来发表一下你的评论吧 !