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系统编程手册》

  • 相关阅读:
    netcore一键部署到linux服务器以服务方式后台运行
    查找100-999之间的水仙花数
    shell创建数据库的脚本
    python打印九九乘法表的菱形实现
    c++一些重要的细节
    MySQL数据库基础学习笔记(二)
    MySQL数据库基础学习笔记(一)
    react-redux 的基本使用
    react-router-dom基本使用+3种传参方式
    从create-react-app 项目搭建开始
  • 原文地址:https://www.cnblogs.com/bencai/p/9162969.html
Copyright © 2011-2022 走看看