首页 > 其他 > 详细

malloc和free的实现

时间:2018-06-10 13:10:55      阅读:163      评论:0      收藏:0      [点我收藏+]

malloc()函数在堆上分配参数size字节大小的内存,并返回指向新分配内存起始位置处的指针,其所分配的内存未经初始化。

#include <stdlib.h>
void *malloc(size_t size) 

free()函数释放ptr参数所指向的内存块,该参数应该是之前由malloc(),或者其他堆内存分配函数之一所返回的地址。

#include <stdlib.h>
void free(void *ptr)

malloc和free的实现:

       malloc:首先会扫描之前由free()释放的空闲内存块列表,以求找到尺寸大于或等于要求的一块内存。如果这一内存块的尺寸正好与要求相当,就把它直接返回给调用者。如果是一块较大的内存,那么将对其进行分割,再将一块大小相当的内存返回给调用者的同时,把剩下的那块内存块保留在空闲列表中。

       如果在空闲内存列表中找不到足够大的空闲内存块,malloc()会调用sbrk()以分配更多的内存。为了减少sbrk()的使用,malloc()并未只是严格按照所需字节数来分配内存,而是以更大幅度(以虚拟内存页大小的倍数)来增加program break,并将超出部分置于空闲内存列表。

       free:当free将内存块至于空闲列表上时,需要知道内存块的大小。通过malloc实现,当malloc()分配内存块时,会额外分配几个字节来存放记录这块内存大小的整数值。该内存位于内存块的起始处,而实际返回给调用者的内存地址位于这一长度记录字节之后。  

技术分享图片  malloc()返回的内存块

       当将内存块置空闲内存列表(双向列表)时,free()会使用内存块本身的空间来存放链表指针,将自身添加到列表中。

关于虚拟内存页:

       虚拟内存的规划之一是将每个程序使用的内存切割成小型的、固定大小的“页”单元,在x86-32中,页面大小为4096个字节。

malloc和free的实现

原文:https://www.cnblogs.com/bencai/p/9162969.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!