对于没有默认构造函数的类数组的operator new

时间:2010-03-26 02:35:19

标签: c++ placement-new new-operator

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

当我阅读更有效的C ++中的代码时,我发现代码如下(我修改了一些部分).....

我的问题是,为什么需要运营商之后的[]?

我没有它测试它,它仍然有效。任何机构都能解释一下吗?

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;
}

4 个答案:

答案 0 :(得分:2)

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

只需确保当你最终释放内存(这里的代码只是泄漏)时,你调用删除或删除[]匹配新的或新的[]。

答案 1 :(得分:2)

答案 2 :(得分:1)

在这种情况下并不严格需要。它们都会分配相同数量的内存,但其中一个需要delete,最后一个需要delete[]。使用new[]可以使您的意图更加清晰,这就是为什么在这里使用它。

答案 3 :(得分:0)

它并不是真正需要的 - 如果您选择这样做,它只是让您有机会为单个对象分别为内存分配内存。