繁体   English   中英

C++ new int[0] -- 会分配内存吗?

[英]C++ new int[0] -- will it allocate memory?

一个简单的测试应用程序:

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

输出:

0x876c0b8

所以看起来它有效。 标准对此有何看法? “分配”空内存块总是合法的吗?

从 5.3.4/7

当 direct-new-declarator 中表达式的值为零时,将调用分配函数来分配一个没有元素的数组。

从 3.7.3.1/2

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

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

这意味着您可以这样做,但您不能合法地(以明确定义的方式跨所有平台)取消引用您获得的内存 - 您只能将其传递给数组删除 - 您应该删除它。

这是一个有趣的脚注(即不是标准的规范部分,但包括用于说明目的)附加到 3.7.3.1/2 的句子

[32. 目的是通过调用 malloc() 或 calloc() 来实现 operator new(),因此规则基本相同。 C++ 与 C 的不同之处在于要求零请求返回非空指针。]

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

标准对此有何看法? “分配”空内存块总是合法的吗?

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

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

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

但是,我相信标准允许malloc(0)类的东西返回NULL

您仍然需要delete []从分配中返回的任何指针。

奇怪的是,即使请求零字节,C++ 也要求 operator new 返回一个合法的指针。 (要求这种听起来很奇怪的行为简化了语言中其他地方的事情。)

我发现Effective C++ Third Edition在“第 51 条:编写 new 和 delete 时遵守约定”中是这样说的。

我向你保证 new int[0] 会花费你额外的空间,因为我已经测试过了。

例如,内存使用情况

int **arr = new int*[1000000000];

明显小于

int **arr = new int*[1000000000];
for(int i =0; i < 1000000000; i++) {
    arr[i]=new int[0];
}

第二个代码片段的内存使用量减去第一个代码片段的内存使用量就是用于大量 new int[0] 的内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM