可能是重复内容:
这是变量还是函数
我错误地使用了类似以下的内容:
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[]
释放内存将导致未定义的行为。
维基百科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)
在当前的维基百科文章new
和delete
(C++)中,已删除示例。
它分配了一个类型为int
的对象,并将其初始化为值100
。
许多人不知道可以向new
传递初始化器,有一种特定的习惯用法应该更广泛地被知道,以避免使用memset
:
new int[100]();
这将分配一个由int
组成的数组,并将其元素初始化为零。
此外,您不应该使用new
的数组版本。针对这个目的有std::vector
。
memset
并添加括号比将new
替换为vector
要容易得多。 - avakarnew int[100]
会使元素保持未初始化状态。 - avakar第一个创建一个新的整数,将其初始化为值100并返回指向它的指针。
在C/C++中,指向数组和指向单一值的指针没有区别(指向数组的指针实际上只是指向其第一个元素的指针)。因此,这是创建具有一个元素的数组的有效方法。
int (*arr)[100]
,C++ 可以区分。只是当你分配一个数组时,即使你分配一个数组,new
不会返回一个指向数组的指针 -- 相反,它返回一个指向数组的第一个元素的指针。原因是指向数组的指针类型包括大小,在运行时,new
无法根据传递的大小返回不同的类型。 - Steve Jessop
placement new
,那么这不是它(语法是不同的)。 - NPEint *arr = (int*)100;
。 - Steve Jessopnew (100) int
。意思是创建一个包含 100 个整数的数组。 - James Kanzenew (reinterpret_cast<void *>(100)) int
,这样你就真的知道你是认真的。 - Dietrich Eppreinterpret_cast
(除非当然有人提供了一个operator new( size_t, int )
)。 - James Kanze