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

使用placement new时,是否应取用作缓冲区的数组的地址?

关于placement new缓冲区数组的正确用法

当我们定义了一个用作placement new缓冲区的数组:

alignas(T) unsigned char buf[sizeof(T)];

以下两种写法都试图在该缓冲区构造T对象:

new (buf) T;
new (&buf) T;

其中第二种写法取的是数组的地址,得到的是指向整个数组的指针而非首元素指针,正确用法是第一种new (buf) T;,原因如下:

  • 数组名buf在表达式中会隐式转换为指向数组首元素的指针(类型为unsigned char*),该指针指向缓冲区的起始地址,且能自动转换为placement new所需的void*类型,完全符合内存缓冲区的使用要求。
  • 第二种写法&buf得到的是指向整个数组的指针(类型为unsigned char (*)[sizeof(T)]),虽然它的地址值和数组首元素地址一致,但类型不符合常规用法:
    • 从类型安全角度,这种写法混淆了数组指针和元素指针的概念,后续析构对象或访问对象时,类型转换逻辑会变得不清晰,容易引入错误。
    • 虽然当前场景下因alignas(T)保证了对齐,地址值合法,但这种写法不符合C++的编码规范,属于不严谨的用法。

结论:使用new (buf) T;是构造T对象的标准、正确写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:02:39