零大小的数组分配是什么意思?

时间:2009-08-11 11:32:07

标签: c++ memory-management

查看一些示例代码并遇到一些零大小的数组分配。我创建了以下代码片段来澄清我的问题

这是有效的代码:

class T
{
};

int main(void)
{
  T * ptr = new T[0];

  return 0;
}

它有什么用? ptr有效吗?这个构造是否可移植?

4 个答案:

答案 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信息无论如何都可能有用。