我错误地使用了类似的东西:
int *arr = new int(100);
它通过编译,但我知道这是错误的。它应该是
int *arr = new int[100];
当我写错了编译器时编译器认为是什么?
答案 0 :(得分:61)
第一行分配一个int
并将其初始化为100
。将int(100)
视为构造函数调用。
由于这是一个标量分配,尝试访问arr[1]
或使用delete[]
释放内存会导致未定义的行为。
答案 1 :(得分:23)
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)
在当前的维基百科文章new
and delete
(C++)中,该示例已被删除。
答案 2 :(得分:9)
它分配一个int
类型的对象,并将其初始化为值100
。
很多人不知道你可以将初始值设定项传递给new
,有一个特定的习惯用法应该更广为人知,以避免使用memset
:
new int[100]();
这将分配一个int
数组并对其元素进行零初始化。
此外,您不应使用new
的数组版本。永远。为此目的有std::vector
。
答案 3 :(得分:0)
第一个创建一个新的整数,将其初始化为值100并返回指向它的指针。
在C / C ++中,指向数组的指针和指向单个值的指针之间没有区别(指向数组的指针实际上只是指向其第一个元素的指针)。所以这是用一个元素创建数组的有效方法。