使用_alloca栈分配字符串存入std::vector<const char*>是否可行?
你的代码存在多处致命问题,完全无法实现预期效果
- 栈内存生命周期完全不匹配:
_alloca分配的内存隶属于调用它的函数的栈帧,一旦add函数执行结束返回,对应的栈帧会被直接回收,你存到全局vec里的指针全部是野指针,后续访问这些指针属于未定义行为,大概率会直接触发段错误,或者读到完全无效的垃圾数据。 - 核心参数计算全部错误:
- 分配大小计算错误:你要分配存储
size个字符的空间,应该是_alloca(size)(sizeof(char)固定为1可以省略),你乘sizeof(char*)相当于多分配了好几倍的无效空间,逻辑完全错误。 - 拷贝长度计算错误:
sizeof(message)取的是指针本身的大小(64位环境下固定为8字节),不是你传入的字符串实际长度,你应该用参数size作为memcpy的第三个参数。
- 分配大小计算错误:你要分配存储
- 栈分配逻辑不满足动态更新需求:
_alloca分配的内存无法手动释放,只能等所属函数栈帧销毁时统一回收,如果你后续要删除数组中的某一个字符串,对应的栈内存完全无法回收,会一直占用栈空间直到函数退出,反而会浪费栈的有限空间。
该场景下使用
_alloca属于不合理设计 - 首先
_alloca不是C/C++标准函数,可移植性极差,不同编译器的实现逻辑、可用大小限制都不一样,后续换编译环境需要修改大量适配代码。 - 栈空间本身非常有限(通常默认只有几MB),就算你当前确认不会溢出,后续需求迭代、字符串长度变大后极容易触发栈溢出,排查难度远高于堆内存溢出。
- 你要降低缓存不命中的需求完全可以用堆上的内存池实现:把所有字符串连续分配在同一块堆内存区域里,缓存命中率和栈上分配几乎没有差异,同时还能手动管理内存生命周期,安全性、可维护性都高很多。
内容的提问来源于stack exchange,提问作者antho
相关产品推荐
相关产品推荐

