全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

free在释放内存的时候,为什么不需要指定内存的

时间:2023-09-15 17:05

人气:

作者:admin

标签: C语言 

导读:malloc在申请内存的时候,需要指定内存的大小,申请成功则返回这块内存的地址,但是free的时候,只需要指定释放的内存的起始地址,系统就知道从这个地址开始需要释放多少个字节。...

free在释放内存的时候,为什么不需要指定内存的大小?

这个是学生前两天面大疆的时候,面试官提出的问题。

这个问题不难,比起malloc申请内存的过程要简单的多。

malloc在申请内存的时候,需要指定内存的大小,申请成功则返回这块内存的地址,但是free的时候,只需要指定释放的内存的起始地址,系统就知道从这个地址开始需要释放多少个字节。

char*ptr = (char *)malloc(128);
free(ptr);
原因也很简单,malloc在申请内存的时候,申请到的内存往往比我们需要的内存大,也就是在我们能使用的内存前面会多出一块内存存放头部信息,这个信息就包含了接下来这块内存的大小。

be51b88e-53a6-11ee-a25d-92fbcf53809c.png  

所以在释放内存的时候,只要根据我们提供的地址,向前再移动一些字节,就能知道需要释放的内存大小。

《unix环境高级编程》一书中也提到:

大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。

当然,这个所谓的头部信息,不同的平台存放的内容也不太一样。

《C程序设计语言》这本书中就提到了一种结构:

union header_t
{
  struct 
  {
     unsigned size;
unionheader_t*next;
  };


  long align;
};
联合体中嵌套了结构体,结构体中包含了两个成员:一个是指向下一个头部的指针,一个表示堆内存的大小。

写个代码验证一下。
char*ptr=(char*)malloc(128);
memset(ptr - 16, 0, 16);
free(ptr);
先用malloc申请一块内存,然后从返回的地址开始,向前16个字节,全部清空成0,然后再用free释放内存。

编译没有问题,但是运行的时候,提示free出错。 这只是个演示代码,实际情况不一定是16个字节。

所以在写代码的时候,一定不要越界访问,一旦出了问题,很难去定位问题的出处。






审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信