堆基础---6 深入理解free()函数

_libc_free

free函数在glibc中的真实名是 _libc_free()

void __libc_free(void *mem) {
   
    mstate ar_ptr;
    mchunkptr p;
    void (*hook)(void *, const void *) = atomic_forced_read (__free_hook);
    if (__builtin_expect(hook != NULL, 0)) {
   
        (*hook)(mem, RETURN_ADDRESS(0));
        return;
    }
    if (mem == 0)
        return;
    p = mem2chunk(mem);
    if (chunk_is_mmapped(p)){
   
        if (!mp_.no_dyn_threshold
                && p->size
                        > mp_.mmap_threshold&& p->size <= DEFAULT_MMAP_THRESHOLD_MAX) {
   
            mp_.mmap_threshold = chunksize(p);
            mp_.trim_threshold = 2 * mp_.mmap_threshold;
            LIBC_PROBE (memory_mallopt_free_dyn_thresholds, 2,
                    mp_.mmap_threshold, mp_.trim_threshold);
        }
        munmap_chunk(p);
        return;
    }
    ar_ptr = arena_for_chunk(p);
    _int_free(ar_ptr, p, 0);
}

流程如下

  • 首先查看是否有__free_hook函数 如果有则先执行__free_hook函数
  • 对于free(NULL) 释放空指针则直接返回不予处理
  • 通过mem2chunk()将指向user_data的指针指向对应的用户所要释放的chunk上
  • 通过chunk_is_mmapped()检测chunk是否是通过mmap映射进来 如果是则先判断释放的chunk的size是否大于mmap_threshold且小于DEFAULT_MMAP_THRESHOLD_MAX 如果是则更新mmap_threshold为要释放的chunk大小,最后通过调用munmap_chunk释放该chunk并返回
  • 之后就是调用**_int_free**完成一般性的chunk释放

_int_free() fastbins

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值