使用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
相关产品推荐
相关产品推荐

