在c ++中按大小零分配内存?

时间:2011-01-10 03:20:42

标签: c++ memory-management

int a = 10;
int *p = new int[0];

p = &a;
cout << *p << endl;

在c ++中,如果将内存大小分配为零会发生什么?

分配后,我得到有效的内存指针,并输出有效的数字。

但我认为new运算符应返回类似FAILD或NULL的内容。

有人可以解释一下细节吗?

5 个答案:

答案 0 :(得分:3)

  

分配后,我得到有效的内存指针,并输出有效的数字。

您提供的代码实际上并未对此进行测试。

执行p = &a时,您重新分配 p 指向某个完全不同的。无论以前做什么与继续执行该计划无关。

答案 1 :(得分:1)

在“a”的块上指定指针“p”,因此在打印时p不再指向零大小的块。

答案 2 :(得分:1)

来自ISO / IEC 14882:2003(E),5.3.4.6

  

direct-new-declarator中的每个常量表达式都应该是一个整型常量表达式(5.19)并计算为严格正值。直接新声明者中的表达式应具有非负值的积分或枚举类型(3.9.1)。 [例如:如果n是int类型的变量,那么new float [n] [5]格式正确(因为n是direct-new-declarator的表达式),但new float [5] [n]是形式错误(因为n不是常数表达式)。如果n为负数,则新浮点数[n] [5]的效果未定义。]

他们很聪明。可以将零视为non-negative value吗?可能是的,因为它编译没有任何问题,我想。

答案 3 :(得分:1)

来自ISO / IEC 14882:2003(E),5.3.4.7

  

当表达式的值在   一个直接新的声明者是零,   调用分配函数   分配一个没有元素的数组。

所以你得到一个有效的指针,但你不能取消引用它,并且仍然必须删除[]它。

答案 4 :(得分:1)

  

在c ++中,如果将内存大小分配为零会发生什么?

零大小的数组有效 您可以取消引用任何成员。

这就是为什么希腊人花了这么长时间辩论它将零视为一个数字。但我们可以感谢印度的伟大思想,最终将0作为数字0归零。它们永远占据了它们并且我们不高兴他们这样做了,如果没有这样一个独特的价值,很多现代数学都是不可能的。

  

分配后我得到有效的内存指针

这是正确的。
如果失败则会抛出异常。

  

并打印有效数字。

您的作业:p = &a;可能不是您想要的。因为这只是泄漏内存并将p设置为指向变量a。你可能想要做的是:

(*p) = a;
// or
p[0] = a;

这是未定义的行为。
正如您在数组结束后分配值一样。

  

但我认为new运算符应返回类似FAILD或NULL的内容。

没有

  

有人可以解释一下细节吗?