如何使用new创建堆上的自动数组[N]

时间:2016-07-26 23:19:05

标签: c++ arrays pointers new-operator

我有一个关于指针和数组的角落案例。

如何在堆上分配固定大小(自动)数组?让我们马上了解代码,了解我想要问的内容:

typedef int ArrayOf10Ints[10];

int f()
{
        ArrayOf10Ints * p = new ArrayOf10Ints; // Error: cannot initialize a variable of type 'ArrayOf10Ints *'
                                               // (aka 'int (*)[10]') with an rvalue of type 'int *'

        ArrayOf10Ints * q = new ArrayOf10Ints[1] // OK: allocates space for 10 ints

        delete q; // Warning: use delete []
}

为什么分配p的表达式不起作用?为什么右值是int*而不是ArrayOf10Ints*?为什么q有效?

注意:我的目标是了解分配pq的意外行为。正如其他人指出的那样,有许多直接的方法可以解决这个问题。例如,在我的情况下,我使用指针来表示数组是可选的 - 它可能存在也可能不存在 - 所以我会这样做:

boost::optional<std::array<int, 10> > optional_array;

2 个答案:

答案 0 :(得分:3)

这是Select FirstName, LastName from Customer Inner Join RegisteredCustomers on Customer.Customerid = RegisteredCustomer.Customerid and CustomerType = 1 的行为,这有点令人惊讶。即使newArrayOf10Ints的别名,但当您在int[10]表达式中使用它时,结果就像您正在编写new一样。

这在[expr.new]/5

中指定
  

当分配的对象是数组时(即使用 noptr-new-declarator 语法或 new-type-id type-id 表示数组类型), new-expression 生成指向数组初始元素(如果有)的指针。

因此,在您的示例中,new int[10]表达式返回new,因此出错。

解决方法是执行您显示的内容

int *

或将数组放在ArrayOf10Ints* q = new ArrayOf10Ints[1]; delete[] q; 中,或使用struct

请注意,即使您要写

std::array

然后您必须使用int* p = new ArrayOf10Ints; ,因为在这种情况下也会调用delete[] p

Live demo

答案 1 :(得分:0)

  

注意:出于讨论之外的原因,我需要完成这个

当然不是,因为错误的东西不起作用。

请改用typedef array<int,10> ArrayOf10Ints; int f() { ArrayOf10Ints * p = new ArrayOf10Ints; // ... delete p; } 。此代码应该可以顺利运行:

new

但我不建议您自己管理delete$('#hollowCircleCv,#fontTextCv,#circleCv,#hollowSquareCv,#squareCv').click(function(){ var isEraserActive = false; }); ,除非您完全确定需要。