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:写入新的和删除时遵守约定”中就是这样说的。