[其他产品] C语言里的malloc和free浅知

[复制链接]
2279|4
 楼主| 王栋春 发表于 2024-10-28 09:36 | 显示全部楼层 |阅读模式
malloc与free
malloc与free是C语言标准库中的函数,用于动态内存分配与释放。
malloc
C语言中的标准库函数,存在于头文件<stdlib.h>中。
函数声明为: void* malloc(size_t size)。
作用:为开辟一块size大小的内存空间,如果分配成功则返回指向这块空间的指针,分配失败则返回空指针NULL。
free
也是C语言中的标准库函数,存在与头文件<stdlib.h>中。
函数声明为: void free(void *ptr)。
作用:将分配给指针ptr指向区域的内存空间进行回收。
这里的ptr必须已经被malloc或者realloc,calloc类型的函数调用过,否则会产生未定义行为。
如果free(ptr)已经被调用过,重复调用也会产生未定义行为。
如果ptr为NULL,不执行任何操作。
实现原理
malloc以及free可以有多种实现方式,并且没有一种方法是完美的,因为我们需要在速度,开销和避免碎片/空间有效性之间做出折衷。
简单来说,我们把进程中一个从x到y的内存区域称为「堆」。所有malloc函数分配的内存会存在这个区域中。malloc会维护一个数据结构,我们干脆简化为一个链表,其中含有内存块的「元信息」,以及真正存放数据的「内存块区域」。当我们调用malloc的时候,它会遍历这个列表寻找有没有合适大小的未分配的内存块,如果有的话,将其指针返回,并且标记这块内存已经被分配了;如果没有的话,它会使用sbrk()这个系统调用来扩大堆区域,也就是说增加y的值(注意这里sbrk一定是一个系统调用,我们不可能从用户空间去改变堆的大小)。并且,这里的y是不能无限制增长的,在Linux中有一个变量RLIMIT_DATA用来限制进程中数据区(data segment,包括初始化数据,未初始化数据以及堆)的最大值。当堆区增长到最大限度后,再调用sbrk就会报ENOMEM错误。

598330983 发表于 2024-10-28 15:21 | 显示全部楼层
不知道这两个函数的机理是什么,如何实现的。
 楼主| 王栋春 发表于 2024-10-28 15:25 | 显示全部楼层
598330983 发表于 2024-10-28 15:21
不知道这两个函数的机理是什么,如何实现的。

我也是借鉴同事给的资料编辑一下而成,至于其它真的不知道呀!纯属硬件小白。
雾都浪漫 发表于 2025-9-15 15:58 | 显示全部楼层
malloc:动态分配内存,返回指向该内存的指针,需检查是否分配成功;2. free:释放 malloc 分配的内存,避免泄漏,释放后指针应置 NULL 防野指针;3. 配对使用:每 malloc 一次需对应 free,否则内存耗尽;4. 注意事项:分配后别越界访问,释放后不可再用;5. 局限:碎片化内存,嵌入式中慎用;6. 替代方案:可预分配内存池,提升效率与安全性。
 楼主| 王栋春 发表于 2025-9-16 07:37 | 显示全部楼层
雾都浪漫 发表于 2025-9-15 15:58
malloc:动态分配内存,返回指向该内存的指针,需检查是否分配成功;2. free:释放 malloc 分配的内存,避 ...

坛友看来非常精通此道,望专门开帖分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4813

主题

28954

帖子

80

粉丝
快速回复 在线客服 返回列表 返回顶部