heap - 10 - _int_free的相关操作

_int_free的一系列操作

注意! 以下步骤若未明确标明退出函数,则表示在执行完当前操作后,继续执行剩余操作

1. 判断当前chunk的大小是否异常小或者异常大,内存有无对齐

  • 如果是,则 报错退出

2. 如果当前chunk大小 小于 fast chunk的最大值

  • 判断下一个内存相邻chunk的size是否异常大或异常小,如果是,则 报错退出
  • 判断当前fastbin链头的chunk是否为当前chunk(防止 连续的 double free)。如果是,则 报错退出
  • 将当前chunk放入fastbin链头
  • 如果实际放入的fast bin,其index与当前chunk的预期index不同,则 报错退出
  • 如果上面的都没出错的话,则函数执行结束,函数返回

3. 判断当前chunk是否是调用mmap分配的

  • 如果是,则
    • 如果当前chunk为top chunk,则意味着double free, 报错退出。因为top chunk为free chunk,不可再被free
    • 如果当前chunk的下一个内存相邻chunk(next chunk),其内存起始地址超过了top chunk的最大内存地址,则 报错退出
    • 如果当前chunk是inuse的,则 报错退出
    • 如果next chunk的size异常大或者异常小,则 报错退出
    • 如果上一个内存相邻chunk是free chunk,则将上一个chunk unlink,并与当前chunk合并
    • 判断next chunk是否为top chunk
      • 如果不是
        • 判断next chunk是否是空闲的(inuse)
          • 如果是,则与当前待释放chunk合并
          • 否则,清空其PREV_INUSE标志位
        • 将当前待释放chunk放入unsorted bin里
      • 如果是
        • 则当前chunk与top chunk合并
    • 如果当前chunk的size大于某个临界点(临界点大小默认65535bytes/64KB)
      • 如果存在fast chunk,则进行malloc_consolidate
      • 判断当前arena是否为main_arena
        • 如果是,并且top chunk的大小超过某个临界点,则调用systrim返还多余内存
        • 否则,调用heap_trim返还内存给操作系统
    • 函数执行结束,函数返回
  • 如果不是,则调用munmap函数释放当前chunk的内存,函数执行结束,函数返回
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2024 Kiprey
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~