查看一些示例代码并遇到一些零大小的数组分配。我创建了以下代码片段来澄清我的问题
这是有效的代码:
class T
{
};
int main(void)
{
T * ptr = new T[0];
return 0;
}
它有什么用? ptr有效吗?这个构造是否可移植?
答案 0 :(得分:8)
5.3.4 C ++标准中:
6 direct-new-declarator 中的每个常量表达式应为整数常量表达式(5.19)并计算为严格正值。 direct-new-declarator 中的表达式应具有带有非负值的整数或枚举类型(3.9.1)......
7当 direct-new-declarator 中的表达式的值为零时,调用分配函数来分配没有元素的数组。
所以,你的代码分配一个数组,其行为在各个方面都像任何其他T数组一样(可以用delete []删除,作为参数传递,可能是其他事情)。但是,它没有可访问的索引(即,读取或写入ptr [0]会导致未定义的行为)。
在这种情况下,常量表达式和表达式之间的区别不在于实际表达式是编译时间常量(显然是0),而是它是否指定了多维数组的“最后”维度。语法在5.3.4:1中定义。
答案 1 :(得分:2)
授权(5.3.4 / 6)。它的结果是一个空数组,因此返回的值是指针经过数组。
答案 2 :(得分:0)
是的,这是有效的行为,而ptr将是有效的。该构造可以移植到所有符合C ++标准的C ++编译器。它很有用,因为它允许你编写不需要特殊情况stuiff的代码来处理元素数量为零的情况。
然而,与往常一样,使用std :: vector(也可以是零大小)而不是数组,你会得到更好的服务。
答案 3 :(得分:0)
相关问题是:What should malloc(0) return?
And from some C99 docs,malloc(0)行为是实现定义的:
是否有calloc,malloc和 realloc函数返回null 指针或指向已分配的指针 请求的大小为零时的对象 (7.20.3)。
空指针或唯一指针 可以传递给free()的指针 归还。
请参见malloc(3C)手册页。
当然,你问的是C ++,但malloc信息无论如何都可能有用。