初始化结构体时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
相关产品推荐
相关产品推荐

