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

初始化结构体时GCC报AddressSanitizer堆缓冲区溢出问题求助

问题根因

核心错误出在mem_alloc函数的新内存分配分支,你写错了malloc的参数:

// 错误写法
void* ptr = malloc(sizeof(size));
// 正确写法
void* ptr = malloc(size);

size本身是size_t类型的参数,sizeof(size)取的是size_t类型的自身字节宽度(通常32位系统为4、64位系统为8),而非你实际需要分配的内存大小。如果Int结构体的实际大小超过了sizeof(size_t),分配的内存空间就小于你实际需要的大小,后续对Int成员赋值时就会触发堆缓冲区溢出,和AddressSanitizer的报错完全吻合。

其他潜在问题
  • 你最初提供的mem_init函数存在笔误:max_size = size/sizeof(MemBlock*);中的size变量未定义,应该使用传入的maxSize参数,不过最小复现代码中没有调用该函数,暂时未触发问题。
  • 空闲块复用分支存在内存泄漏:你没有释放块中旧的block->ptr就直接重新分配新内存,旧内存的地址会被直接覆盖无法回收。
if (block->free) {
    free(block->ptr); // 补充这行释放旧内存
    mem_size -= block->size;
    mem_size += size;
    block->free = false;
    block->ptr = malloc(size);
    block->size = size;
    // 剩余逻辑
}
  • 你当前的Int结构体包含默认成员初始化,属于非POD类型,直接用malloc分配内存不会调用构造函数,后续直接赋值存在未定义行为,C++场景下建议替换为new或者配合std::allocator实现内存分配。

内容的提问来源于stack exchange,提问作者CyanDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 13:57:03