首页 > 代码库 > malloc的小知识

malloc的小知识

1.malloc不是直接向操作系统申请,而是先由glibc内存管理器收到请求,其分配一段内存并把内存地址返回给用户。

2.对于返回的内存地址p,p-4这个地址记录了malloc空间的大小,这就是当你free时可以直接释放内存而不用指定大小的原因。

3.这个malloc回来的空间大小是8字节对齐的,也就是每次都是8的倍数。

4.对于p-4这里记录malloc空间大小不是空穴来风,而是因为他本身就是属于一个叫做malloc_chunk的数据结构的一部分,如下图


struct malloc_chunk{

INTERNAL_SIZE_T prev_szie;

INTERNAL_SIZE_T size;

标志位;

用户数据;

}

5.当运行

p = malloc(20);
strcpy(p, "Hello,world");
第一行定义了申请一个虚拟空间,第二行发生了页中断进一步申请了物理空间。

6.运行

printf("0x%x\n",*(p-4));
得到0x19,去除3个的标志位的影响,得到0x18,真实申请的空间大小也就是24,由20个字节实现8字节对齐就可以计算出24。

7.标志位解释

p = 1 表示上一块正被使用 pre_size此时通常为0

p  = 0 表示上一块空闲 pre_size通常为上一块的大小

M = 1 表示该内存块通过mmap分配,只有分配大块内存时才采用mmap,对应释放要采用munmap_chunk(),否则使用chunk_free()

M = 0 表示不是用mmap分配的。

8.malloc每次分配至少16字节,所以每次只分配1、2字节实际上会造成不必要的浪费。


by: p4inkiller