"new int(100)"有什么作用?

JAS*_*SON 38 c++ new-operator

可能重复:
这是变量还是函数

我错误地使用了类似的东西:

int *arr = new int(100);
Run Code Online (Sandbox Code Playgroud)

它通过编译,但我知道这是错的.它应该是

int *arr = new int[100];
Run Code Online (Sandbox Code Playgroud)

当我写错了编译器时,编译器会怎么想?

NPE*_*NPE 63

第一行分配一个int并初始化它100.将其int(100)视为构造函数调用.

由于这是一个标量分配,尝试访问arr[1]或释放内存delete[]将导致未定义的行为.

  • @RedX:不,它会指向一个动态分配的地址,其中包含`int`值100.您正在考虑`int*arr =(int*)100;` (14认同)
  • @RedX:如果你正在考虑放置`new`,这不是它(语法不同). (5认同)
  • @SteveJessop或者,正如NPE建议的那样,`new(100)int`. (4认同)
  • @JamesKanze:我确定需要一个演员...`new(reinterpret_cast <void*>(100))int`,所以你真的知道你的意思. (2认同)

Peo*_*are 24

维基百科新(C++)引用:

int *p_scalar = new int(5); //allocates an integer, set to 5. (same syntax as constructors)
int *p_array = new int[5];  //allocates an array of 5 adjacent integers. (undefined values)
Run Code Online (Sandbox Code Playgroud)

UPDATE

在当前的维基百科文章newdelete(C++)中,该示例已被删除.

另外这里的直观性较差,但完全可靠的C++参考newnew[].

  • 这就是为什么我没有给+2,@ AlvinWong ;-)但是你会注意到这是这个问题的唯一答案,它甚至试图引用.由于我喜欢引用(对可靠来源更是如此),我会奖励这种行为. (5认同)
  • @AlvinWong这不是,几乎按照定义.唯一的"可靠"来源(对于这个问题)将是C++标准(如果你引用任何东西,你应该引用它). (4认同)
  • @Richard,但我被告知维基百科不是一个可靠的来源! (2认同)

ava*_*kar 9

它分配一个类型的对象int并将其初始化为value 100.

很多人都不知道你可以传递一个初始化器new,有一个特定的习惯用法应该更广为人知,以避免使用memset:

new int[100]();
Run Code Online (Sandbox Code Playgroud)

这将分配一个数组int并对其元素进行零初始化.

此外,您不应该使用的数组版本new.永远.就是std::vector出于这个目的.

  • “一个应该更广为人知的特定习语......你不应该使用 new 的数组版本。永远”——那么为什么这个习语应该更广为人知呢?;-) (2认同)