实验三——Malloc Lab

本文档详述了一项实验,旨在构建一个内存分配器,用于检测内存泄漏、重复释放和数组越界等错误。实验涉及设计特定的数据结构、宏、辅助函数和内存分配相关函数,通过一系列测试用例验证其功能。在实验过程中,作者发现了修改内存块头部信息可能导致的严重问题,并调整了数据结构以避免此类错误。

一、实验要求
写一个封装好的内存分配器,可以捕捉当在代码中调用malloc和free时所出现的错误。也就是检测出内存泄漏、重复释放指针两次、数组越界等问题。

二、数据结构
定义一个结构体,在每块请求的内存前面是一个结构体+一个fence。结构体如下:
这里写图片描述

占用16个字节。又因为一个fence是4个字节,所以在每块有效内存前面是20字节,在有效内存后面是4字节的fence。所以每块完整的经过封闭的内存是24+size字节。
又定义了一个链表结点,用来存储每一块已分配的内存块,如下:
这里写图片描述

三、宏
定义了5个宏,如下:
这里写图片描述

四、辅助函数
定义了5个辅助函数,如下:
这里写图片描述

这里写图片描述

五、与分配内存有关的函数
几个需要实现的函数主体如下:
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

六、错误号对应的信息

char *getMsg(int
### 关于 Malloclab 的概述 Malloclab 是一种专注于内存分配算法实现与优化的教学实验项目,通常用于计算机科学课程中的操作系统或数据结构部分。其核心目标是让学生通过实践理解动态内存管理机制的工作原理以及性能影响因素。 在 malloclab 中,学生需要设计并实现自己的 malloc 和 free 函数来替代标准库中的版本[^2]。这些函数负责处理堆内存的分配和释放操作,并需满足特定的要求,例如高效的空间利用率、低碎片化率以及良好的时间性能。 以下是关于 malloclab 实验的一些关键技术要点: #### 1. **malloc 和 free 的基本功能** `malloc(size_t size)` 应当返回一块连续的可用内存区域指针;如果无法找到足够的空间,则应返回 NULL。而 `free(void *ptr)` 则会将之前由 malloc 分配的一块内存标记为空闲状态以便后续重用[^3]。 ```c void* malloc(size_t size); void free(void* ptr); ``` #### 2. **内存池的设计** 为了提高效率,可以采用固定大小的小型对象缓存策略或者分页式大块分配方法。常见的设计方案包括但不限于显式链表法(explicit lists)、隐式链表法(implicit lists),以及位图表示法(bitmap representation)。每种方式都有各自的优缺点,在实际编码过程中可以根据需求权衡选择[^4]。 #### 3. **边界标签技术 (Boundary Tags)** 此技术用来存储额外的信息以帮助管理和追踪已分配区块的状态及其尺寸信息。它对于检测越界访问错误非常有用,并且能够简化 coalesce 过程——即将相邻的自由块合并成更大的单个空闲区段[^5]。 #### 4. **性能考量** 除了正确性之外,还需要关注以下几个方面: - 时间复杂度:寻找合适位置进行分配的时间开销应该尽可能少; - 空间复杂度:减少内部/外部碎片的数量至关重要; - 可扩展性:支持不同类型的请求模式而不显著降低整体表现水平[^6]。 --- ### 示例代码片段 下面展示了一个简单的基于 implicit list 方法的 malloc/free 原型实现: ```c #include <stdio.h> #include <string.h> typedef struct BlockHeader { size_t size; // Size of block including header/footer. int free; // Is this block currently allocated? } BlockHeader; #define GET_SIZE(bp) ((bp)->size & ~7) #define PREV_FREE(bp) (((bp)->size >> 1) & 1) // Simplified version for demonstration purposes only... void* my_malloc(size_t request_size){ /* Implementation omitted */ } void my_free(void *ptr){ /* Implementation omitted */ } ``` --- ### 总结 完成 malloclab 不仅能加深对底层硬件架构的理解,还能培养解决真实世界问题所需的工程技能。参与者将会学到如何平衡各种相互冲突的目标,比如速度 vs 容量利用率之间的取舍等问题[^7]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值