malloc与free的原理

malloc/free用于内部数据类型动态的申请内存及释放内存。

1. malloc 与 free的原理

malloc 函数利用系统调用来完成对内存的申请分配,系统将可用的内存块连接成为一个长长的列表称为空闲链表,调用malloc时,将遍历链表,找到满足申请空间的空闲链表块,然后将链表块分为两个部分,一部分大小和用户申请的相同,分配给用户使用,另一部分返回给链表。调用free时,将用户释放的内存块连接到链表中。这样,空闲链表中会存在大量的内存碎片,如果用户调用malloc申请大的内存块时,链表中就可能不存在满足要求的空闲内存块,这时malloc函数请求延时,并对空闲链表中内存块执行整理,将相邻的内存块合并成大的内存块,如果用户的申请的内存大于空闲链表可提供的最大连续内存,将调用系统调用指令mmap向系统申请新的虚拟内存满足用户需要,并将其加入链表管理。

2. malloc 与free的实现

利用空闲链表算法作为堆空间分配算法,在实现上将整个堆空间按照是否被占用分割为若干空闲(Free)块和占用(Used)块,它们之间利用双向链表连接起来。当用户要申请一块内存时,堆分配算法将遍历整个链表,直到找到一块满足要求的空闲块,如果这个空闲块正好和所申请大小相同,就直接标记空闲块为占用块,然后将地址返回给用户。如果空闲块大小大于用户申请大小,就将空闲块分割为两部分,其中一块大小为申请大小,分配给用户,并标记为占用,另外一块仍为空闲块。如果没有找到足够大的空闲块,则利用系统调用(brk, mmap)向系统申请再申请一块空间。

当用户释放一块内存时,堆分配算法会判别被释放的内存块钱后两个块是否为空闲块,如果是,将它们合并为一个大的空闲块,标记为空闲块,不是,直接标记为空闲块。

3. malloc/free 与 new/delete 区别

  • malloc/free是标准库函数, new/delete 是操作符,都是用于动态申请内存和释放内存。
  • malloc/free只能用于内部数据类型,new/delete可以用于自定义类型,在申请内存空间同时还要调用构造函数进行对象的初始化,以及在对象消亡之前自动调用析构函数。
  • C程序中只能用malloc/free管理动态内存。
  • 可以认为new操作符是malloc函数加上构造函数执行。new 操作符返回的是带类型的对象,而malloc返回的是void*,需要进行类型强制转换。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值