C++ 运算符new(n)与放置new的新无符号字符[n]

C++ 运算符new(n)与放置new的新无符号字符[n],c++,memory-management,new-operator,placement-new,C++,Memory Management,New Operator,Placement New,我正在分配内存,稍后将用于构建具有placementnew的对象。我应该使用运算符new(n),还是应该使用新的无符号字符[n]?为什么?前者返回指向某个存储区域的指针。后者返回一个指针,指向数组中包含某些对象的第一个元素。如果需要存储,请使用提供存储而不是对象的存储。因素: new[]必须与delete[]/new()匹配delete 他们交流不同的东西operator new(n)是用于未指定用途的内存请求,而new unsigned char[n]松散地表示要在其中存储字符 阵列形式的

我正在分配内存,稍后将用于构建具有placement
new
的对象。我应该使用
运算符new(n)
,还是应该使用
新的无符号字符[n]
?为什么?

前者返回指向某个存储区域的指针。后者返回一个指针,指向数组中包含某些对象的第一个元素。如果需要存储,请使用提供存储而不是对象的存储。

因素:

  • new[]
    必须与
    delete[]
    /
    new()
    匹配
    delete
  • 他们交流不同的东西
    operator new(n)
    是用于未指定用途的内存请求,而
    new unsigned char[n]
    松散地表示要在其中存储字符
阵列形式的性能/效率可能稍差-具体细节取决于您的实现:

5.3.4/12 new T[5]导致调用运算符new,其中x是表示数组分配开销的非neagtive未指定值:新表达式的结果将从
运算符new[]
返回的值中减去此值

顺便说一句,两者都没有初始化:

  • operator new()
    向未初始化内存返回一个
    void*
    :请参见3.7.4.1/2“从分配函数返回时,对已分配存储的内容没有限制”,而5.3.4/15说“创建类型为T的对象的新表达式按如下方式初始化该对象:如果新的初始值设定项被初始化,则该对象为默认初始化(8.5)”;8.5/6表示只有类类型默认构造函数提供初始化

我认为两者都可以。@sftrabbit:所以在对齐、语义、性能等方面没有区别?@Mehrdad“语义“-确实有区别,有什么区别?它们不是都未初始化吗?或者你只是说这是一个可读性问题?@Elazar否。没有对象使用
运算符new[n]
初始化
newunsigned char[n]
default初始化一个
unsigned char
数组(而
unsigned char
的默认初始化不执行初始化)。@Elazar:也不初始化-我的答案中提供了标准参考。我很困惑,谁是Elazar?o_O@Mehrdad后来有人删除了他们的评论。