gpt4 book ai didi

c++ - 如何使用 new 在堆上创建一个自动数组 [N]

转载 作者:太空狗 更新时间:2023-10-29 21:15:11 25 4
gpt4 key购买 nike

我有一个关于指针和数组的特殊情况。

如何在堆上分配固定大小(自动)的数组?让我们立即查看代码以了解我要问的问题:

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;

最佳答案

这是 new 的一个行为,有点令人惊讶。即使 ArrayOf10Intsint[10] 的别名,当您在 new 表达式中使用它时,结果就像您在编写new int[10] 代替。

这在 [expr.new]/5 中指定

When the allocated object is an array (that is, the noptr-new-declarator syntax is used or the new-type-id or type-id denotes an array type), the new-expression yields a pointer to the initial element (if any) of the array.

因此在您的示例中,new 表达式返回一个 int *,因此会出现错误。

解决方法是按照您所显示的进行操作

ArrayOf10Ints* q = new ArrayOf10Ints[1];
delete[] q;

或将数组放在结构中,或使用std::array

请注意,即使你要写

int* p = new ArrayOf10Ints;

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

Live demo

关于c++ - 如何使用 new 在堆上创建一个自动数组 [N],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38601371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com