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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:12:37