我错误地使用类似:
int *arr = new int(100);
,并将其传递编译,但我知道这是不对的。它应该是
int *arr = new int[100];
编译器认为这是什么时,我写错了吗?
我错误地使用类似:
int *arr = new int(100);
,并将其传递编译,但我知道这是不对的。它应该是
int *arr = new int[100];
编译器认为这是什么时,我写错了吗?
第一行分配单个int
并将其初始化为100
。将int(100)
视为构造函数调用。
由于这是标量分配,试图访问arr[1]
或使用delete[]
释放内存将导致未定义的行为。
它分配一个int
类型的对象并将其初始化为值100
。
很多人不知道,你可以传递一个初始化到new
,有应更广为人知,从而避免使用memset
做出了具体的成语:
new int[100]();
这将分配一个数组int
并对其元素进行零初始化。
另外,您不应该使用new
的阵列版本。永远。为此目的有std::vector
。
“一个特定的习惯应该被广为人知......你不应该使用新的阵列版本” - 那么为什么这个习语应该更广为人知呢? ;-) –
@SteveJessop,好点:)虽然在修复旧的代码库时,删除memset和添加括号比用'vector'替换new更容易。 – avakar
@avakar,我仍然没有得到什么是... new int [100](); 有人可能用一个例子详细阐述 – eRaisedToX
第一个创建一个新的整数,将其初始化为值100并返回一个指向它的指针。
在C/C++中,指向数组的指针和指向单个值的指针(指向数组的指针实际上只是指向其第一个元素的指针)之间没有区别。所以这是用一个元素创建数组的有效方法。
指向数组的指针看起来像'int(* arr)[100]',C++可以区分。只是'new'不会返回一个指向数组的指针,即使你分配了一个数组 - 而是它返回一个指向数组的第一个元素的指针。原因是大小是指向数组的指针类型的一部分,当然'new'不能返回一个不同的类型,这取决于在运行时传递它的大小。 –
应该是“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)
+1表示引用。 – Richard
@Richard,但我被教导说维基百科不是一个可靠的来源! –
@AlvinWong这不是,几乎是根据定义。 (对于这个问题)唯一的“可靠”源代码就是C++标准(如果你引用了任何东西,这就是你应该引用的内容)。 –
@RedX:如果你想放置'new'的,这是不是它(语法是不同的)。 – NPE
@RedX:不,它会指向一个包含int值100的动态分配地址。你正在考虑int * arr =(int *)100;' –
@SteveJessop或者,正如NPE建议的那样, 'new(100)int'。 –