0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

学益得智能硬件 来源:学益得智能硬件 2023-09-15 17:05 次阅读

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个字节。

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






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7565

    浏览量

    133435

原文标题:free()为什么不需要指定内存大小

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    linux的内存释放操作

    Linux系统下,我们一般 不需要释放 内存,因为系统已经将 内存管理的很好。但是凡事也有例外,有的 时候
    发表于07-26 07:05

    Linux内存系统: Linux内存分配算法

    , kmem_cache_ free() 在其参数所 指定的高速缓存中 释放一个 slab9、内核态 内存池1) 基本原理· 先申请分配一定数量的、 大小
    发表于08-24 07:44

    【原创】堆内存的那些事

    时候,根据指针指向的堆 内存区域的情况和指针 大小重新分配 内存。对于realloc()作为重新分配 内存
    发表于07-12 09:48

    使用malloc()和free()函数动态的分配/释放内存的危害

    前言本文会从以下几个方面阐述使用malloc()和 free()函数动态的分配/ 释放 内存的危害。存在的问题在嵌入式中无法很难实现对 内存的动态映射(虚拟
    发表于12-14 07:56

    可以使用malloc()和free()这两个函数动态分配内存释放内存

    ANSI C中,可以使用malloc()和 free()这两个函数动态分配 内存释放 内存,但是,
    发表于12-17 08:26

    使用rt_free释放内存时出现tofreea bad data block:的错误是为什么?

    最近在使用rt_ free 释放 内存时会出现to freea bad data block:的错误。期初怀疑重复 释放
    发表于03-17 09:24

    请教内存释放是否是rt_free后就完成呢

    问题描述:1.在线程中调用了一个函数A,该函数会申请 内存函数结束前会再 释放。测试中发现这个函数在线程中调用几次后就提示异常,申请不到 内存。2:请教: 内存
    发表于08-29 11:41

    LINUX内核中的内存是如何进行分配的

    size);size:待分配的 内存大小,自动按页对齐。默认 动态 内存映射区分配。分配的 内存在内核空间中连续(虚拟连续),物理上无需连续。
    发表于11-04 14:46

    如何在Win 2003中安全的释放内存

    如何在Win 2003中安全的 释放 内存经常看到有朋友 论坛上诉苦说 需要 释放 内存,其实如果你安
    发表于01-29 11:36 660次阅读

    基于SLUB的DEBUG功能,如何帮忙检测内存越界和访问已经释放内存

    SLAB 内存分配器-SLUB的DEBUG功能,如何帮忙检测 内存越界(out-of-bounds)和访问已经 释放内存(use-after- free
    的头像 发表于02-08 14:11 9238次阅读
    基于SLUB的DEBUG功能,如何帮忙检测<b class='flag-5'>内存</b>越界和访问已经<b class='flag-5'>释放</b>的<b class='flag-5'>内存</b>

    Android内存管理机制与分析工具

    Android 系统中有个垃圾 内存回收机制, 虚拟机层自动分配和 释放 内存,因此 不需要在代码中
    的头像 发表于05-11 14:44 4433次阅读

    STM32内存管理

    内存管理详解1、介绍 内存管理,是指软件运行时对计算机 内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且 适当的 时候
    发表于12-24 19:37 13次下载
    STM32<b class='flag-5'>内存</b>管理

    malloc和free简介及实现方式说明

    malloc 分配 指定 大小内存空间,返回一个指向该空间的指针。 大小以字节为单位。返回 void* 指针, 需要强制类型转换后才能引用其中的值
    的头像 发表于05-14 09:56 4393次阅读
    malloc和<b class='flag-5'>free</b>简介及实现方式说明

    realloc函数和free函数的实验及注意事项

    拷贝到新分配的 内存区域,而后 释放原来 mem_address 所指 内存区域(注意:原来指针是自动 释放不需要使用
    的头像 发表于10-21 16:51 578次阅读

    内存释放free步骤

    内存 释放 freePublic_ fREe() void public_ fREe(Void_t* mem) { mstate ar_ptr;
    的头像 发表于11-09 11:31 644次阅读