C ++新的<datatype>(<value>)到底做了什么?</value> </datatype>

时间:2012-10-17 00:18:00

标签: c++ pointers stack heap new-operator

在此代码中:

int * p = new int(44);

p在堆上分配,它指向的值是44; 但现在我也可以这样做:

p[1] = 33;

没有收到错误。我一直以为

int * p = new int(44);

只是另一种说法“P在堆上分配并指向包含44的地址”,但显然它使p成为一个int数组的指针?是这个新阵列44的大小?或者这个结果是不寻常的。

3 个答案:

答案 0 :(得分:5)

你是对的:P在堆上分配并指向包含44的地址。没有分配数组。 p[1] = 33;是他们所谓的“未定义行为”。您的程序可能崩溃,但不保证每次执行此操作都会崩溃。

答案 1 :(得分:0)

int *p_scalar = new int(5); //allocates an integer, set to 5.

如果您访问p_scalar [n](n&lt;&gt; 0),它可能会崩溃

答案 2 :(得分:0)

在您的示例中,C ++语言为下标运算符提供了一个默认实现,指针看起来与此类似:

(*Ptr)& operator[](size_t index)
{
   return *(address + index*sizeof(*Ptr));
}

这可以随时重载并替换为任何类型。当你说:

时,整数也不例外
int * pointer = alocate_int_array();
pointer[1] = 1;

您正在使用该运算符的编译器扩充默认实现。