自制malloc实现:split(块分割)功能开发遇阻
实现malloc的块分割(Split)功能
核心逻辑
当找到的空闲块剩余空间足够容纳一个新的块元数据+最小可用空间时,才执行分割。剩余空间的判断标准是:block->size - size >= sizeof(struct s_block),确保分割出的新块至少能作为一个有效空闲块存在。
修改后的代码实现
struct s_block *last = linked_list; block = find_free_block(&last, size); if (!block) // 未找到空闲块 { block = try_to_fusion(last, size); if (!block) { return NULL; } } else // 找到空闲块 { // 检查是否有足够空间分割出一个新的空闲块 if (block->size - size >= sizeof(struct s_block)) { // 创建新的空闲块 struct s_block *new_block = (struct s_block *)((char *)block + sizeof(struct s_block) + size); new_block->size = block->size - size - sizeof(struct s_block); new_block->free = 1; new_block->next = block->next; // 更新原块的大小和链表指针 block->size = size; block->next = new_block; } block->free = 0; // 标记原块为已使用 } return(block+1);
代码说明
- 空间判断:先确认剩余空间能放下一个完整的块元数据,避免生成无法使用的碎片块。
- 新块计算:通过指针偏移计算新块的起始地址,
(char *)block是为了按字节偏移,加上原块的元数据大小和用户请求的size,得到新块的起始位置。 - 新块初始化:设置新块的大小(剩余空间减去元数据大小)、标记为空闲,并更新链表指针,让原块指向新块,新块指向原块原本的下一个节点。
- 原块更新:把原块的大小调整为用户请求的size,标记为已使用。
内容的提问来源于stack exchange,提问作者Boogie
相关产品推荐
相关产品推荐

