千家信息网

malloc与free

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,《UNIX环境高级编程》在大部分操作系统中,内存分配由以下两个简单的函数来处理:void *malloc (long numbytes):该函数负责分配 numbytes 大小的内存,并返回指向第一个
千家信息网最后更新 2026年11月01日malloc与free

《UNIX环境高级编程》

在大部分操作系统中,内存分配由以下两个简单的函数来处理:
void *malloc (long numbytes):该函数负责分配 numbytes 大小的内存,并返回指向第一个字节的指针。
void free(void *firstbyte):如果给定一个由先前的 malloc 返回的指针,那么该函数会将分配的空间归还给进程的"空闲空间"。


malloc和free大量使用后回造成内存碎片,那么这种碎片形成的原理是什么?
如果机理是申请的内存空间大小(太小)所形成的,那么,申请多大的区域能够最大限度的避免内存碎片呢?(这里的避免不是绝对的避免,只是一种概率)

内存碎片一般是由于空闲的连续空间比要申请的空间小,导致这些小内存块不能被利用。

产生内存碎片的方法很简单,举个例:
假设有一块一共有100个单位的连续空闲内存空间,范围是0~99。如果你从中申请一块内存,如10个单位,那么申请出来的内存块就为0~9区间。这时候你继续申请一块内存,比如说5个单位大,第二块得到的内存块就应该为10~14区间。
如果你把第一块内存块释放,然后再申请一块大于10个单位的内存块,比如说20个单位。因为刚被释放的内存块不能满足新的请求,所以只能从15开始分配出20个单位的内存块。


现在整个内存空间的状态是0~9空闲,10~14被占用,15~24被占用,25~99空闲。其中0~9就是一个内存碎片了。如果10~14一直被占用,而以后申请的空间都大于10个单位,那么0~9就永远用不上了,造成内存浪费。

如果你每次申请内存的大小,都比前一次释放的内村大小要小,那么就申请就总能成功。


有的人喜欢自己编写内存管理模块,程序一开始就申请一大块内存,然后以后申请内存都在这个大内存中取,配合一定的技巧来减少内存碎片问题。


一般按页为单位,4k

malloc ,operator new 这些都有自己的分配策略,只要不是使用系统API,而是用库,则一般来说不用自己考虑

一般情况如果你申请的内存都是比较大,而且比较有规律的话(比如你只申请16k和4k两种大小的内存)就没问题。不过这样的话就要你自己加一个层次来处理这些大内存了。


内存 单位 空间 碎片 大小 空闲 分配 函数 区间 指针 比如说 系统 问题 大内 处理 高级 成功 操作系统 这样的话 一般来说 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司华为 圆梦互联网科技 科技类互联网 北京互联网科技 奇士达互联网科技 左右互联网络科技 字节跳动和互联网科技 世界互联网科技公司市值排名 智腾互联网科技有限公司 成都互联网科技公司工作好不好 广州市恰铎互联网科技有限公司 互联网科技创新的路径 合肥互联网科技公司公章图片 每天都有哪些好的互联网科技 智帮互联网科技公司最近动向 互联网时代高科技布局 河南商务圈互联网科技有限公司 上海旺乐尼互联网科技有限公司 互联网的黑科技实验室 互联网大会出现的黑科技 互联网科技战争 港股互联网科技股 北京互联网络科技有限公司 互联网科技网站 镁科技互联网资讯平台 厦门比较好的科技互联网公司 广州互联网高科技取餐柜 湖北辰鑫科技互联网 长沙易易互联网科技有限公司 安徽九吞吴互联网科技有限公司
0