47

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

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

int *arr = new int(100);

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

int *arr = new int[100];

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

4

4 回答 4

70

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

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

于 2012-12-10T09:15:49.857 回答
27

维基百科新(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)

更新

在当前的 Wikipedia 文章newdelete(C++)中,该示例已被删除。

此外,这里是不太直观但完全可靠的 C++ 参考newnew[].

于 2012-12-10T09:17:58.303 回答
11

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

很多人不知道您可以将初始化程序传递给new,有一个特殊的习惯用法应该更广为人知,以避免使用memset

new int[100]();

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

此外,您不应该使用数组版本的new. 曾经。就是std::vector为了这个目的。

于 2012-12-10T09:15:52.023 回答
0

第一个创建一个新的整数,将其初始化为值 100 并返回一个指向它的指针。

在 C/C++ 中,指向数组的指针和指向单个值的指针之间没有区别(指向数组的指针实际上只是指向其第一个元素的指针)。因此,这是创建具有一个元素的数组的有效方法。

于 2012-12-10T09:16:56.880 回答