实验讲解—1.有关内存管理的AP简介 void free(void *ptr)i fre函数释放ptr指向的内存块,释放出的内存可以在之后的 malloc调用中被使用。 注意pt必须指向由 malloc. calloc、 realloc分配的内存块的 起始位置。 2021/1/26
实验讲解——1.有关内存管理的API简介 ➢free函数释放ptr指向的内存块,释放出的内存可以在之后的 malloc调用中被使用。 ➢注意:ptr必须指向由malloc、calloc、realloc分配的内存块的 起始位置。 2021/1/26 6 void free(void *ptr);
实验讲解—2隐式空闲链表管理 隐式空闲链表 隐式空闲链表将堆中的内存块按地址顺序串成一个链表,接受到内 存分配请求时,分配器遍历该链表来找到合适的空闲内存块并返回。 当找不到合适的空闲内存块时(如堆内存不足,或没有大小足够的 空闲内存块),调用Sbk向堆顶扩展更多的内存。 未使用的 堆的 双字 起始 8/0 16/l 320 对齐的 ■图中淡蓝色部分为已分配块,深蓝色为填充块(为了内存双字对齐 数字为块头部。 2021/1/26
实验讲解——2.隐式空闲链表管理 ➢隐式空闲链表 ◼ 隐式空闲链表将堆中的内存块按地址顺序串成一个链表,接受到内 存分配请求时,分配器遍历该链表来找到合适的空闲内存块并返回。 ◼ 当找不到合适的空闲内存块时(如:堆内存不足,或没有大小足够的 空闲内存块),调用sbrk向堆顶扩展更多的内存。 ◼ 图中淡蓝色部分为已分配块,深蓝色为填充块(为了内存双字对齐), 数字为块头部。 2021/1/26 7
实验讲解—2隐式空闲链表管理 >块头部表 ■堆中的各内存块需要某种标志来区分块的边界,记录块的大小,以 及标记该内存块是否已被使用。因此为每个内存块保留一个字(4字 节)的头部记录这些数据。 块头部记录了该内存块的大小。由于内存块以8字节对齐,块大小 二进制的最低3位一定为0,因此可以用最后一位来标记该块是否已 被分配。 31头部 210 ma1loc返回一个指针, 块大小 a=1:已分配的 00a a=0:空闲的 它指向有效载荷的开始处 有效载荷 块大小包括头部 (只包括已分配的块) 有效载荷和所有的填充 填充(可选) 个简单的堆块的格式 2021/1/26
实验讲解——2.隐式空闲链表管理 ➢块头部表 ◼ 堆中的各内存块需要某种标志来区分块的边界,记录块的大小,以 及标记该内存块是否已被使用。因此为每个内存块保留一个字(4字 节)的头部记录这些数据。 ◼ 块头部记录了该内存块的大小。由于内存块以8字节对齐,块大小 二进制的最低3位一定为0,因此可以用最后一位来标记该块是否已 被分配。 2021/1/26 8