2011-01-10 45 views
0
int a = 10; 
int *p = new int[0]; 

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

在C++中,如果通过零分配内存大小会发生什么?在C++中按大小零分配内存?

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

但我认为新的运营商应该返回类似FAILD或NULL。

任何人都可以解释细节吗?

+4

您示例的后半部分与分配无关。你只是“忘记”了分配,泄漏了内存,并使用了分配的内存。 – SilverbackNet 2011-01-10 03:24:38

+2

重复:http://stackoverflow.com/questions/1087042/c-new-int0-will-it-allocate-memory – Anthony 2011-01-10 03:30:40

回答

1

在C++中,如果零分配内存的大小会发生什么?

零大小的数组是有效的。
你可以去参考任何成员。

这就是为什么希腊人花了这么长时间辩论它作为一个数字为零的想法。但是,我们可以感谢印度的伟大头脑,因为它最终将零数字作为0.它永远消耗了它们,我们不是很高兴它们做到了,如果没有这种独特的价值,许多现代数学将不可能实现。

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

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

并打印有效数字。

您的任务:p = &a;可能不是你想要的。因为这只是泄漏内存并将p指向变量a。你可能试图做的是:

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

这是未定义的行为。
正如您在数组结尾后赋值。

但我认为new运算符应该返回类似FAILD或NULL的东西。

大家能否详细解释一下?

是的。

3

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

您提供的代码实际上并没有进行测试。

当你做p = &a,你重新分配p指向的地方完全不同。无论它以前持有什么都与继续执行该计划无关。

1

您在“a”的块上分配指针“p”,以便在打印时p不再指向零大小的块。

1

从ISO/IEC 14882:2003(E)5.3.4.6

在直接新的说明符的每个常数表达式应该是一个整型常量表达式(5.19)和评价一个严格为正值。新直接声明者中的表达应具有整数或者非零的值(3.9.1)。 [例如:如果n是一个int类型的变量,那么新的float [n] [5]是格式良好的(因为n是直接新声明符的表达式),但是新的float [5] [n]是形成不良(因为n不是一个常量表达式)。如果n为负数,则新float [n] [5]的效果未定义。]

它们是智能的。零可以被认为是non-negative value?可能是肯定的,因为它编译没有问题,我想。

1

从ISO/IEC 14882:2003(E),5.3.4.7

当表达在 直新声明符是零值,则分配 函数被调用,以分配 没有元素的数组。

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