malloc和free的实现

Posted bencai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了malloc和free的实现相关的知识,希望对你有一定的参考价值。

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的实现的主要内容,如果未能解决你的问题,请参考以下文章

malloc和free的实现

malloc 和 free 在 C 中是如何实现的? [复制]

日本程序开发式自定义的malloc/free函数-源代码(ソースコード)

内存管理 malloc free 的实现

malloc 和 free 如何处理错误?

malloc() 和 free() 在哪里存储分配的大小和地址?