2012-12-10 245 views

回答

56

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

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

+5

@RedX:如果你想放置'new'的,这是不是它(语法是不同的)。 – NPE

+14

@RedX:不,它会指向一个包含int值100的动态分配地址。你正在考虑int * arr =(int *)100;' –

+4

@SteveJessop或者,正如NPE建议的那样, 'new(100)int'。 –

8

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

很多人不知道,你可以传递一个初始化到new,有应更广为人知,从而避免使用memset做出了具体的成语:

new int[100](); 

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

另外,您不应该使用new的阵列版本。永远。为此目的有std::vector

+1

“一个特定的习惯应该被广为人知......你不应该使用新的阵列版本” - 那么为什么这个习语应该更广为人知呢? ;-) –

+1

@SteveJessop,好点:)虽然在修复旧的代码库时,删除memset和添加括号比用'vector'替换new更容易。 – avakar

+0

@avakar,我仍然没有得到什么是... new int [100](); 有人可能用一个例子详细阐述 – eRaisedToX

0

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

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

+4

指向数组的指针看起来像'int(* arr)[100]',C++可以区分。只是'new'不会返回一个指向数组的指针,即使你分配了一个数组 - 而是它返回一个指向数组的第一个元素的指针。原因是大小是指向数组的指针类型的一部分,当然'new'不能返回一个不同的类型,这取决于在运行时传递它的大小。 –

+2

应该是“C++无法区分指向数组元素的指针和指向单个值的指针。” –

21

Wikipedia 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

+1表示引用。 – Richard

+2

@Richard,但我被教导说维基百科不是一个可靠的来源! –

+4

@AlvinWong这不是,几乎是根据定义。 (对于这个问题)唯一的“可靠”源代码就是C++标准(如果你引用了任何东西,这就是你应该引用的内容)。 –

相关问题