228 c++ memory-management standards-compliance new-operator
一个简单的测试应用:
cout << new int[0] << endl;
Run Code Online (Sandbox Code Playgroud)
输出:
0x876c0b8
Run Code Online (Sandbox Code Playgroud)
所以它看起来很有效.标准对此有何看法?"分配"空白内存块总是合法的吗?
Fai*_*ali 229
从5.3.4/7开始
当direct-new-declarator中的表达式的值为零时,将调用分配函数以分配不带元素的数组.
从3.7.3.1/2开始
取消引用作为零大小请求返回的指针的效果是未定义的.
也
即使[new]请求的空间大小为零,请求也会失败.
这意味着你可以做到,但你不能合法地(在所有平台上以明确定义的方式)取消引用你得到的内存 - 你只能将它传递给数组删除 - 你应该删除它.
这是一个有趣的脚注(即不是标准的规范部分,但包含在说明目的中)附在3.7.3.1/2的句子上
[32.目的是通过调用malloc()或calloc()来实现operator new(),因此规则基本相同.C++与C的不同之处在于要求零请求返回非空指针.
小智 21
是的,像这样分配一个零大小的数组是合法的.但是你也必须删除它.
Chr*_*isW 15
标准对此有何看法?"分配"空白内存块总是合法的吗?
每个对象都有一个唯一的标识,即一个唯一的地址,这意味着一个非零长度(如果你要求零字节,实际的内存量将无声增加).
如果您分配了多个这些对象,那么您会发现它们具有不同的地址.
Eva*_*ran 14
是的,分配一个0
大小的块是完全合法的new
.由于没有有效的数据供您访问,因此您无法对其执行任何有用的操作.int[0] = 5;
是非法的.
但是,我相信标准允许malloc(0)
返回的东西NULL
.
您仍然需要delete []
从分配中获得的任何指针.
归档时间: |
|
查看次数: |
57705 次 |
最近记录: |