C ++中的'new'运算符和typedef-ed数组

时间:2011-04-28 12:24:52

标签: c++ new-operator typedef

  

可能重复:
  Is it possible to dynamically create an array of constant size in C++?

这是一个理论问题 - 我想知道为什么C ++中的operator new []会返回指向数组第一个元素的指针而不是实际数组(或指向它的指针)。在尝试做

之类的事情时,我遇到了这个问题
typedef int int4[4];
int4* ni4 = new int4;

虽然我知道为什么这不起作用(虽然在开始时它不是很清楚;)),但它确实让我觉得代码原则上A* ptr= new A;无法编译。我是唯一发现这种奇怪的人吗?

4 个答案:

答案 0 :(得分:1)

我觉得奇怪的是使用了operator new[]。代码尝试分配聚合的单个实例,如果聚合是struct,这将是合法的。

但这是[expr.new]部分标准所述的行为。

但是,有一个非常简单的解决方法:

typedef int int4[4];
int4* ni4 = new int4[1];

...

delete [] ni4;

答案 1 :(得分:0)

我不太确定我是否理解你的问题。在C ++中,与C一样,指向数组第一个元素的指针与数组本身没有区别。

编辑:正如我所指出的,这不是真的正确 - 请原谅我的错误,我最近花了太多时间使用Java和C#; - )

答案 2 :(得分:0)

可能会为以下

辩护
new (int[N]); // type int(*)[N]
new int[N]; // type int*
new T; /* T* */

仅在中间情况下,N可以是运行时值。然而,规范并没有建立这种类型的差异。几乎在所有情况下,数组都需要特殊处理(例如,你不能只复制它们)。所以你应该准备好特别处理它们。例如,在您的情况下,您还必须使用delete[]而不是delete

为了说清楚,如果上述情况属实,那么你需要笨拙的语法

int (*p)[N] = new (int[N]);
(*p)[N-1] = 0;
p[0][N-1] = 0; /* or, equivalently */
p[N-1] = 0; /* but not this, error! */

首先需要取消引用数组指针。

答案 3 :(得分:0)

它是来自C的遗产,实际上它是B的遗产.C ++中对原生数组的整个处理非常糟糕,但它们无法改变它。这就是C ++中许多问题的情况。