"new int(100)"是什么意思?

51

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

我错误地使用了类似以下的内容:

int *arr = new int(100);

虽然它能够编译通过,但我知道这是错误的。正确的应该是

int *arr = new int[100];

当我写错编译器时,它会认为它是什么?

4个回答

76

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

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


5
如果你在考虑使用placement new,那么这不是它(语法是不同的)。 - NPE
14
不,它将指向一个动态分配的地址,其中包含整数值100。你可能在想 int *arr = (int*)100; - Steve Jessop
4
@SteveJessop 或者像 NPE 建议的那样,使用 new (100) int。意思是创建一个包含 100 个整数的数组。 - James Kanze
2
@JamesKanze:我确定这需要一个转换... new (reinterpret_cast<void *>(100)) int,这样你就真的知道你是认真的。 - Dietrich Epp
@DietrichEpp 是的。它肯定需要 reinterpret_cast(除非当然有人提供了一个 operator new( size_t, int ))。 - James Kanze

31

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

更新

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

此外,这里提供了一个不太直观但完全可靠的C++参考文档,用于newnew[]


2
@Richard 但是我被教导说维基百科不是一个可靠的来源! - Alvin Wong
4
“几乎从定义上来讲,这不是可靠的。对于这个问题,唯一‘可靠’的来源应该是C++标准(如果您要引用任何内容,就应该引用它)。” - James Kanze
6
这就是为什么我没有给 @AlvinWong +2 分的原因;-) 但你会注意到,这是对这个问题唯一尝试引用的答案。因为我喜欢引用(尤其是可靠来源),所以我奖励这种行为。 - Richard
该引用是指旧版本的文章。在当前版本中,对new的不同调用的描述得到了扩展,但示例已被删除。 - Peopleware

12

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

许多人不知道可以向new传递初始化器,有一种特定的习惯用法应该更广泛地被知道,以避免使用memset

new int[100]();

这将分配一个由int组成的数组,并将其元素初始化为零。

此外,您不应该使用new的数组版本。针对这个目的有std::vector


2
“一种特定的习惯用法应该被更广泛地知晓...你永远不应该使用数组版本的new。”--那么为什么这种习惯用法应该更广泛地知晓呢?;-) - Steve Jessop
1
@SteveJessop,说得好:) 不过在修复旧代码库时,删除memset并添加括号比将new替换为vector要容易得多。 - avakar
@avakar,我仍然不明白...new int 100;是什么意思,请有人详细说明并举个例子。 - eRaisedToX
@eRaisedToX,Java是一种完全不同的语言。在C++中,new int[100]会使元素保持未初始化状态。 - avakar
@avakar,是的,说得对,明白了,谢谢! - eRaisedToX
显示剩余2条评论

0

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

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


4
一个指向数组的指针看起来像 int (*arr)[100],C++ 可以区分。只是当你分配一个数组时,即使你分配一个数组,new 不会返回一个指向数组的指针 -- 相反,它返回一个指向数组的第一个元素的指针。原因是指向数组的指针类型包括大小,在运行时,new 无法根据传递的大小返回不同的类型。 - Steve Jessop
2
C++无法区分指向数组元素的指针和指向单个值的指针。 - Joseph Mansfield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接