You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:50:40