一个简单的测试应用程序:
cout << new int[0] << endl;
输出:
0x876c0b8
看起来它工作了。标准对此有何规定?"分配"空的内存块始终合法吗?
一个简单的测试应用程序:
cout << new int[0] << endl;
输出:
0x876c0b8
看起来它工作了。标准对此有何规定?"分配"空的内存块始终合法吗?
来自5.3.4/7
当直接的new声明符(expression)的值为零时,调用分配函数以分配一个没有元素的数组。
来自3.7.3.1/2
对返回大小为零请求的指针进行解引用的效果是未定义的。
此外
即使请求[new]的空间大小为零,请求仍可能失败。
这意味着您可以这样做,但是您不能在所有平台上以合法的方式解引用获得的内存-您只能将其传递给数组delete-并且您应该删除它。
这是一个有趣的脚注(即标准的非规范性部分,但包含说明性内容)附加到来自3.7.3.1/2的句子:
[32. 意图是通过调用malloc()或calloc()来实现operator new(),因此规则基本相同。 C ++不同于C,需要零请求返回非空指针。]
new[]
和 delete[]
时会出现内存泄漏 - 无论大小如何。特别是,当您调用 new[i]
时,需要比您尝试分配的内存稍微多一点,以存储数组的大小(在释放时由 delete[]
使用)。 - pqnetint ar[0];
是非法的,为什么 new 是可以的呢? - Mottisizeof(type)
应该永远不会返回零。例如请参考:https://dev59.com/inE85IYBdhLWcg3wvGOm - pqnet标准上对此有什么规定吗?“分配”空块内存是否总是合法的?
每个对象都有唯一的身份(即唯一的地址),这意味着它们具有非零长度(如果您请求零字节,则实际内存量将被静默增加)。
如果您分配了多个这些对象,则会发现它们具有不同的地址。
operator []
也在某个地方存储数组的大小(请参见https://isocpp.org/wiki/faq/freestore-mgmt#num-elems-in-new-array)。因此,如果实现使用数据分配字节数,则可以仅为字节数和0字节的数据分配,返回1-past-last指针。 - Steed调用应该返回不同的指针。顺便说一下,
new expression还有一些额外的规则(5.3.4)。我找不到任何线索表明
new`的大小为0时实际上是“必须”分配任何内容的。抱歉,我投了反对票,因为我发现你的回答没有回答问题,而是提供了一些有争议的声明。 - Steed是的,使用new
分配一个大小为0
的块是完全合法的。但你无法对此做出任何有用的操作,因为没有有效的数据可供访问。尝试int[0] = 5;
就是不合法的。
然而,我相信标准允许像malloc(0)
这样的操作返回NULL
。
无论如何,你仍需要delete []
从分配中获得的指针。
int **arr = new int*[1000000000];
比...明显更小
int **arr = new int*[1000000000];
for(int i =0; i < 1000000000; i++) {
arr[i]=new int[0];
}