【问题标题】:new operator with parentheses "(", ")" instead of brackets "[", "]"带有括号“(”,“)”而不是括号“[”,“]”的新运算符
【发布时间】:2014-10-16 09:40:46
【问题描述】:

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

我写了以下行:

GLfloat* points = new GLfloat(1024);

而不是

GLfloat* points = new GLfloat[1024];

我只是注意到它。在我注意到错误之前,我的代码已经编译并运行了几次。我意识到这是侥幸,但我的问题是我最初的线路是做什么的?

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

【问题讨论】:

  • 内置类型的构造函数调用或值初始化。
  • 值初始化:codepad.org/KDPyKSMG
  • 这就是你使用new[]... :)
  • @user3728501: std::vector.
  • @user3728501: 如果std::vector 不适合任何环境,那么new[](或new)和malloc 也不适合那里。标准容器的默认分配器使用堆,就像newmalloc 一样(但可能比任何基于手动调用newmalloc 的自写容器机制更好)。如果您需要替换静态数组,请使用std::arrayboost::array

标签: c++


【解决方案1】:

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

int i(10);

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

【讨论】:

    【解决方案2】:

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

    GLfloat* points = new GLfloat(1024);
    

    相当于:

    float* points = new float(1024);
    

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

    【讨论】:

    • 为什么使用文字 double 1024.0 而不是文字 float 1024.0f(而原始文字是文字 int 1024)?
    • @Jarod42 在float(1024) 文字中int 隐式转换为1024.0f。我使用1024.0 来表示将分配给分配的float 的值,这是否令人困惑?
    • 并不令人困惑,只是奇怪地引入了另一种类型,它也隐式转换为1024.f。但这只是一个细节。
    【解决方案3】:

    我原来的那条线是做什么用的?

     GLfloat* points = new GLfloat(1024);
    

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

    int * points = new int(1024);
    

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

    相当于把下面的代码写成精简版:

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

    更多解释请见here

    【讨论】:

      猜你喜欢
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      相关资源
      最近更新 更多