为何char数组作为placement new参数属于未定义行为且不被允许?
为什么char数组不能作为placement new的存储参数?
你可能见过类似这样的代码:
struct A { ... }; char buf[1024]; auto ptr = new (buf) A(...);
但实际上,new (buf) A(...);属于未定义行为(UB)。
C++标准中有明确规定:
作为特殊情况,对象可在unsigned char数组或std::byte数组(C++17起)中创建(此时称该数组为对象提供存储),需满足:
- 数组生命周期已开始且未结束
- 新对象的存储完全容纳于该数组内
- 数组中无满足上述约束的嵌套数组对象
之所以禁止用char数组做placement new的存储,核心原因有两个:
符号特性的不确定性:char的符号属性由编译器实现定义(可能是带符号,也可能是无符号)。如果是带符号char,在部分硬件架构下,字节值的符号扩展或者陷阱表示可能篡改对象的原始内存数据,破坏对象完整性,导致程序行为不可预测。
语义上的明确区分:C++标准希望将"承载原始字节的存储容器"和"存储字符数据的容器"做明确划分。char数组的语义是存放字符序列,而unsigned char和std::byte是专门设计用来承载任意对象原始内存的类型。这种区分能避免字符操作(比如字符串处理函数)和对象存储操作之间产生意外冲突,保障对象生命周期管理的安全性。
内容的提问来源于stack exchange,提问作者xmllmx
相关产品推荐
相关产品推荐

