带有括号 "(" 的新运算符,")" 而不是括号 "[" 、 "]"

new operator with parentheses "(", ")" instead of brackets "[", "]"

本文关键字:运算符      更新时间:2023-10-16

我在我的代码中发现了一个疯狂的错误

我写了下面这行:

GLfloat* points = new GLfloat(1024);

而不是

GLfloat* points = new GLfloat[1024];

我刚刚才注意到。在我注意到错误之前,我的代码已经编译并运行了几次。我知道这是侥幸,但我的问题是,我原来的这条线是做什么的?

我注意到它看起来有点像使用指向已分配内存的指针创建类。它是否在堆上创建一个初始值为1024.0的GLfloat ?如果这是真的,为什么它是有效的语法?(GLfloat不是一个类,是吗?)

GLfloatfloat(即typedef float GLfloat;)的OpenGL别名。因此代码:

GLfloat* points = new GLfloat(1024);

等价于:

float* points = new float(1024);

分配一个浮点数,初始化为1024.0,并将其地址分配给指针points

是的,您正在初始化为1024.0的堆上创建单个GLFloat。您可以使用与类相同的语法初始化原语。例如

int i(10);

将在初始化为10的堆栈上创建一个int类型

我原来的行做了什么?

 GLfloat* points = new GLfloat(1024);

让我们尝试用int替换GLfloat,您将看到,如果GLFloat是类似于intfloat的类型,那么您将有以下内容:

int * points = new int(1024);

上面的语句意味着你正在创建一个指向int的指针,初始值为1024。因此,在您的情况下,这意味着创建一个指向变量的指针points,类型为GLfloat,初始值为1024

相当于以下内容的精简版:

int * points = new int;
*points = 1024;