C ++新的int – 它会分配内存?

简单的testing应用程序:

cout << new int[0] << endl; 

输出:

 0x876c0b8 

所以它看起来像它的作品。 标准对此有何评论? “分配”空的内存块是否合法?

从5.3.4 / 7

当直接新声明符中expression式的值为零时,将调用分配函数来分配一个没有元素的数组。

从3.7.3.1/2开始

取消引用作为零大小请求返回的指针的效果未定义。

即使[new]请求的空间大小为零,请求也可能失败。

这意味着你可以做到这一点,但是你不能合法地(在所有平台上以一种明确的方式)解引用你得到的内存 – 你只能将它传递给数组删除 – 你应该删除它。

这里有一个有趣的脚注(即不是标准的规范部分,但包含在说明中)附在3.7.3.1/2

[32。 意图是让operator new()通过调用malloc()或calloc()来实现,所以规则基本相同。 C ++与C不同之处在于要求零请求返回一个非空指针。]

是的,像这样分配一个零大小的数组是合法的。 但是你也必须删除它。

标准对此有何评论? “分配”空的内存块是否合法?

每个对象都有一个唯一的标识,即一个唯一的地址,这意味着一个非零的长度(如果要求零字节,实际的内存量将被无声地增加)。

如果你分配了多个这些对象,那么你会发现他们有不同的地址。

是的,分配一个0大小的块是完全合法的。 你根本无法做任何有用的事情,因为没有有效的数据供你访问。 int[0] = 5; 是非法的。

不过,我相信这个标准允许像malloc(0)这样的东西返回NULL

你仍然需要delete []你从分配中得到的任何指针。

奇怪的是,C ++要求operator new返回一个合法的指针,即使在请求零字节的时候。 (要求这种奇怪的声音行为简化了语言中的其他地方。)

我发现有效的C ++第三版在“项目51:写入新的和删除时遵守约定”中就是这样说的。