文章目录
  1. 1. C库函数malloc
    1. 1.1. 1.组织结构
    2. 1.2. 2.分配过程
    3. 1.3. 3.释放过程
  2. 2. Unix系统调用sbrk
  3. 3. malloc/free与new/delete

malloc是C库函数。用于分配堆内存。是在运行时分配存储空间的函数。
头文件: stdlib.h
函数原型:void *malloc(unsigned int num_bytes);

C库函数malloc

1.组织结构

空闲存储空间以空闲链表的方式组织,每个块包含一个长度,一个指向下一块的指针,以及一个指向自身存储空间的指针。按照存储地址升序组织。最后一块指向第一块。
malloc的内存块结构

2.分配过程

有申请时,malloc顺序扫描空闲链表。直到找到一个足够大的块。算法为“首次适应”。寻找过程中,如果块大小等于需求大小,直接返回;如果块大小太大,分成两部分,一块为需求大小,将它返回(一般是块的后半部分),另一块留在链表中;如果找不到足够大的块。调用sbrk向操作系统申请更大块加入空闲链表。

3.释放过程

free首先搜索空闲块链表,找到相邻空闲块,则合并为一块。避免碎片。
malloc块链表

Unix系统调用sbrk

函数原型:char *sbrk(int incr);

它返回下一个内存空间。则sbrk(0)能得知堆的结束地址program break.
sbrk是一个Linux的系统调用。它增加或者减少堆空间的长度。完成虚拟地址到物理地址的映射。在malloc申请空间不足时,malloc会调用sbrk来申请更多的内存加入到空闲块链表上。如下图,sbrk就是移动堆的program break的位置。
Linux进程堆内存布局

malloc/free与new/delete

  1. malloc是C标准库函数,new是C++的运算符。
  2. 对于用户自定义的对象而言,用malloc/free不能够执行构造函数和析构函数。因为malloc是库函数,不受编译器控制。
  3. 对于内置的数据对象,比如int char等,用new 和用malloc都可以。
文章目录
  1. 1. C库函数malloc
    1. 1.1. 1.组织结构
    2. 1.2. 2.分配过程
    3. 1.3. 3.释放过程
  2. 2. Unix系统调用sbrk
  3. 3. malloc/free与new/delete