2009-08-11 27 views
5

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

这是合法的代码:

class T 
{ 
}; 

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

    return 0; 
} 

它的用途是什么? ptr有效吗?这个构造是否便携?

回答

8

在C++标准5.3.4:在直接新声明符

6每常数表达式应整数表达式(5.19),并计算为严格正值。所述表达直接新声明符应具有与非负值整数或枚举类型(3.9.1)...

7当表达的在直接的值新声明者为零,调用分配函数来分配没有元素的数组。

所以,你的代码分配一个数组,其行为在任何方面都像T的任何其他数组(可以使用delete []删除,作为参数传递,可能还有其他东西)。但是,它没有可访问的索引(即,读取或写入ptr [0]导致未定义的行为)。

在此上下文中,常量表达式和表达式之间的差异不在于实际表达式是否为编译时间常量(显然为0),而是指定多维数组的“最后”维度。语法在5.3.4:1中定义。

0

是的,它是有效的行为,ptr将是有效的。该构造对于遵循C++标准的所有C++编译器是可移植的。这是有用的,因为它允许您编写不需要特殊情况stuiff的代码来处理元素数量为零的情况。

但是,与往常一样,通过使用std :: vector(也可以是零大小)而不是数组可以更好地服务。

2

它被授权(5.3.4/6)。其结果是一个空数组,所以返回的值是指向数组的指针。

0

一个相关的问题是:What should malloc(0) return?

And from some C99 docs,malloc的(0)的行为是实现定义:

是否释放calloc,malloc和 realloc函数返回一个空 指针或当请求的大小为零时指向分配的 对象 (7.20.3)。

返回空指针或可传递给free() 的唯一 指针。

请参阅malloc(3C)手册页。

当然你问的是C++,但是malloc信息无论如何都可能是有用的。

+1

C++新定义良好。 – AProgrammer 2009-08-11 11:47:02

相关问题