zoukankan      html  css  js  c++  java
  • 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系统编程手册》

  • 相关阅读:
    03-数据库必会问题
    2017.06.29数据挖掘基础概念第二.三章
    2017.06.29 数据挖掘概念知识第一章
    2017.06.9 金融时间序列分析之Eview使用基础
    2017.05.27 WeX5后端服务开发之注册
    2017.5.24 Git使用说明初级
    2017.05.06FreeCodeCamp编程之JS面向对象编程学习
    2017.05.05FreeCodeCamp前端编程之Javascript实现laohuji
    2017.05.05 freecodecamp前端编程之正则表达式
    2017.5.2 Javascript练习之FreecodeCamp--21点算法
  • 原文地址:https://www.cnblogs.com/bencai/p/9162969.html
Copyright © 2011-2022 走看看