_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