• c语言 malloc和free的实现


    alloc()函数在堆上分配参数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个字节。

    参考 《Linux/Unix系统编程手册》

  • 相关阅读:
    C#获取url中参数键值对的方法
    一款css3很美的iphone注册表单样式
    很震撼的HTML5视频播放器,电影院的感觉
    html5菜单折纸效果
    web服务器之nginx与apache
    安装win8、ubuntu双系统的过程
    新学C#线程使用总结
    人民币大写金额转换C#方法
    可以调整gif动画图片尺寸的很实用的php类
    JS获取html对象的几种方式说明
  • 原文地址:https://www.cnblogs.com/bencai/p/9162969.html
Copyright © 2020-2023  润新知