malloc

malloc函数在运行时分配内存。它需要以字节为单位的大小并在内存中分配那么多空间。这意味着malloc(50)将在内存中分配50个字节。它返回一个void指针

calloc

与malloc一样,calloc也在运行时分配内存,并在stdlib.h中定义。它需要元素的数量和每个元素的大小(以字节为单位),将每个元素初始化为零,然后返回一个指向内存的void指针。

void * calloc(n,element-size);

这里,'n'是元素的数量,'element-size'是每个元素的大小。

这里都会指定大小, 那为什么free的时候,只需要void free(指针)呢?

比较常见的实现是隐藏块头

https://www.zhihu.com/question/20362709

当调用malloc(size)时,实际分配的内存大小大于size字节,这是因为在分配的内存区域头部有类似于
struct control_block {
unsigned size;
int used;
};
这样的一个结构,如果malloc函数内部得到的内存区域的首地址为void *p,那么它返回给你的就是p + sizeof(control_block),而调用free(p)的时候,该函数把p减去sizeof(control_block),然后就可以根据
((control_blcok*)p)->size得到要释放的内存区域的大小。这也就是为什么free只能用来释放malloc分配的内存,如果用于释放其他的内存,会发生未知的错误。

但是当有大量的小的内存块分配的时候, 都需要加上块头,这种分配分式就不友好啦.

基于chunk 的管理

https://www.zhihu.com/question/302440083

把整个虚拟内存地址空间分成(看作)连续的 chunk,每一个 chunk 有固定的尺寸(一般是 4k*n,n >= 1),并且按自身对齐。以 4k 为例,那么第一个 chunk 是 [0,4095] 这一段,第二个 chunk 是 [4096,8191],第三个 [8192,12287]…以此类推。每一次从虚拟内存上分配时都按 chunk 分配(因为虚拟内存是基于 paging 的,所以一定能保证按自身对齐),然后再在 chunk 上管理小尺寸分配。这样,在 free 的时候,只要把入参地址除以 chunk 的尺寸(实践中是地址对齐,用位运算即可),就能得到这个地址所属的 chunk。chunk 的头部存放了它的管理结构,所以能得知 free 的正确尺寸。chunk 管理上可以有不同的算法,一个比较有效的做法是 freelist:即把一个 chunk 再分成若干个相同尺寸的小块,并用指针把它们连接起来形成链表结构,malloc 和 free 都维护这个链表就行了。不同尺寸的 malloc 会落入不同的 chunk,而 free 总是能找到对的那个 chunk。

malloc返回的指针有双重作用,一是新分配的内存起始地址,二是内存资源的句柄(Handle),即管理器内部分配的编号。

对于任何资源管理器来说,只要给出句柄就能找到资源的全部信息了。

最新文章

  1. 关于ThinkPHP3.2框架接收不到json数据的解决办法
  2. iOS.Performance-trick-presentViewController-is-so-slow-in-didSelectRowAtIndexPath
  3. hibernate和mybatis的区别
  4. css整理-05 边框,背景和浮动,定位
  5. 前后台数据传输两种方式:servlet、Controller
  6. fastBinaryJSON
  7. Linux下编译Boost
  8. Kruskal算法 Swordfish
  9. js仿百度文库文档上传页面的分类选择器_第二版
  10. 仿Iconfont-阿里巴巴矢量图标库 搜索动画
  11. 前端小课堂 js:函数的创建方式及区别
  12. 模拟生产搭建Standby RAC实验环境(11.2.0.4 DG)
  13. Java开源生鲜电商平台-团购模块设计与架构(源码可下载)
  14. 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)
  15. 论文笔记:Capsules for Object Segmentation
  16. vue的双向数据绑定实现原理
  17. pytho常用模块2——random
  18. XVFB实现selenium在linux上无界面运行安装篇
  19. composer install 时,提示:Package yiisoft/yii2-codeception is abandoned, you should avoid using it. Use codeception/codeception instead.的解决
  20. Spring Security构建Rest服务-0702-个性化用户认证流程2

热门文章

  1. 给页面添加Canvas鼠标光标星星跟随动画特效
  2. AcWing 288. 休息时间
  3. c/c++ 日常积累
  4. JZ-049-把字符串转换成整数
  5. JZ-025-复杂链表的复制
  6. LeetCode-031-下一个排列
  7. python库安装中Microsoft Visual C++ is required解决方法
  8. 记录一次docker容器内修改my.cnf配置文件max_allowed_packet参数的过程
  9. 华为交换机配置telnet、SSH
  10. mybatis连接sql