创建指针数组时operator new []的语法

时间:2012-05-29 08:26:36

标签: c++ new-operator dynamic-arrays dynamic-allocation

我在使用new[]运算符时遇到问题,而在创建指向char的指针数组时。由于char*是我想要的元素类型,我使用括号来包围它,但它不起作用:

char **p = new (char *)[vector.size()];

但当我摆脱括号时,它起作用:

char **p = new char *[vector.size()];

为什么后者有效?

2 个答案:

答案 0 :(得分:2)

char *p = new char[10];为大小为10个字符的数组动态分配一个内存块,并返回其第一个元素的地址,然后将其存储到p中(使p指向这个记忆块的开头)。

在这种情况下,new关键字后跟数组类型说明符,您指定类型
char **p = new char*[10]; - 此案例的类型为char*,而不是(char*)。查看operator new[]

您可能会因为C风格的malloc语法而感到困惑,其返回值的类型始终为void*,可以将其转换为其他类型,以便您可以取消引用它。这就是你使用(char*)语法(C风格类型转换)的情况:char *p = (char*) malloc(10);
虽然注意到在C中这个演员阵容是多余的:Do I cast the result of malloc?

请注意,应使用new[]释放使用delete[]分配的内存,malloc分配的内存应由free释放。

答案 1 :(得分:1)

这是“声明跟随使用”的结果。 char **p;可以理解为“如果我取消引用p两次,我会得到char”。 (char*) *p左侧没有类型,并被解析为表达式,意思是:“取消引用p并将结果转换为指向char的指针。”

char **单独用作类型名称时,类似的约定成立。 (char*) *根本不解析为类型名称,而是作为表达式解析(因为左侧没有类型)。