找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4634|回复: 0
打印 上一主题 下一主题
收起左侧

C语言malloc的实现原理工作机制详解

[复制链接]
跳转到指定楼层
楼主
ID:102668 发表于 2016-1-16 07:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
                       
C语言的malloc分配的的内存大小
没读过malloc()的源码,所以这里纯粹是"理论研究"。
malloc()在运行期动态分配分配内存,free()释放由其分配的内存。malloc()在分配用户传入的大小的时候,还分配的一个相关的用于管理的额外内存,不过,用户是看不到的。所以,
实际的大小 = 管理空间 + 用户空间
那么,这个管理内存放在什么位置呢,它要让free()函数能够找到,这样才能知道有多少内存要释放,所以一种可能的方案是在分配内存的初始部分用若干个字节来存储分配的内存的大小。这里要注意一个问题,就是,在malloc()将这个分配的空间返回给某个指针后,这个指针的使用与其它指针应该是没有差别的,所以,管理空间应该在这个指针指向的空间之外,但又要free()从这个指针可以找到管理信息,所以,这个管理空间的大小放在指针指向的相反方向。故malloc()的具体操作应该就是分配一块内存,在前面若干字节中写入管理信息,然后返回管理信息所占字节之后的地址指针。
=================================================
malloc()工作机制
malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表