C++ 没有默认构造函数的类数组的新运算符

C++ 没有默认构造函数的类数组的新运算符,c++,placement-new,new-operator,C++,Placement New,New Operator,对于没有默认构造函数的类,可以使用运算符new和placement new来声明此类的数组 当我用更有效的C++读取代码时,我发现代码如下(我修改了部分)……/P> 我的问题是,为什么在操作员之后需要新的[] 我在没有它的情况下测试它,它仍然有效。有人能解释吗 class A { public: int i; A(int i):i(i) {} }; int main() { void *rawMemory = operator new[] (10 * si

对于没有默认构造函数的类,可以使用运算符new和placement new来声明此类的数组

<>当我用更有效的C++读取代码时,我发现代码如下(我修改了部分)……/P> 我的问题是,为什么在操作员之后需要新的[]

我在没有它的情况下测试它,它仍然有效。有人能解释吗

class A {
    public:
    int i;

    A(int i):i(i) {}
};

int main()
{
      void *rawMemory = operator new[] (10 * sizeof(A));   // Why [] needed here?
      A *p = static_cast<A*>(rawMemory);

      for(int i = 0 ; i < 10 ; i++ ) {

            new(&p[i])A(i); 

      }

      for(int i = 0 ; i < 10 ; i++ ) {

            cout<<p[i].i<<endl;

      }

      for(int i = 0 ; i < 10 ; i++ ) {

            p[i].~A();

      }

    return 0;
}
A类{
公众:
int i;
A(int i):i(i){}
};
int main()
{
void*rawMemory=operator new[](10*sizeof(A));//为什么这里需要[]?
A*p=静态_转换(内存);
对于(int i=0;i<10;i++){
新的(&p[i])A(i);
}
对于(int i=0;i<10;i++){

cout不需要。运算符new和运算符new[]之间的唯一区别是,第一个是通过使用关键字new调用的,另一个是通过关键字new[]调用的。两者都分配原始内存


只要确保在最终释放内存(此处的代码只是泄漏)时,调用与new或new[]匹配的delete或delete[]。

在这种情况下,这不是严格需要的。它们都将分配相同的内存量,但其中一个需要
delete
,另一个需要
delete[]
结尾。使用
new[]使您的意图更加明确,这就是为什么它被使用在这里。

< P>它不是真正需要的——它只是给了您一个机会,为您的数组分配内存,与单独的对象分开,如果您选择这样做。

< P>我很惊讶,有效的C++会建议您使用一些像Hasky那样的代码作为< >空*> /代码>。
new[]
做了一件非常具体的事情:它分配了一个动态大小的数组。分配给它的数组应该传递给
delete[]
delete[]
然后读取一个隐藏的数字,以查找数组中有多少元素,并销毁对象,就像您对
p[i].~a();
所做的那样

但是,这个用法与此不兼容。数组是静态大小的,没有正确使用<代码>新[]代码/代码>(没有<代码>操作符< /代码>),就没有办法得到隐藏的数字或动态大小的销毁,而这又需要一个默认构造函数。C++的一个真正的弱点。 如果您像其他人建议的那样在
main
末尾调用
delete[]
,您的代码可能会崩溃。
相反,您需要使用
operator delete[]
,这看起来像是一个打字错误,只是一个等待发生的意外


使用非数组<代码>操作符new < /Cal>和<代码>操作符删除< /C> >并且如果你必须使用这个技巧,请给出足够的注释。但是我不认为C++是特别有效的。

这是一个重复的例子,但是这个问题实际上没有产生任何答案,只是很多变体。“全局运算符new是一个愚蠢的特性,它不应该是C++的,任何一个称之为裤子的人都是这样”。另一方面,这个问题确实有一些答案,基本上“这没什么区别,只是使用了正确的版本<代码>操作员删除< /代码>”:你是否记得“代码>删除[]?”
你的记忆,你会看到它唯一的区别。
:)