dub*_*nde 5 c++ memory-management
查看一些示例代码并遇到一些零大小的数组分配.我创建了以下代码片段来澄清我的问题
这是有效的代码:
class T
{
};
int main(void)
{
T * ptr = new T[0];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有什么用?ptr有效吗?这个构造是否可移植?
5.3.4在C++标准中:
6 direct-new-declarator中的每个常量表达式都应是一个整数常量表达式(5.19),并评估为严格正值.该表达的直接新的说明符应与非负值整数或枚举类型(3.9.1)...
7当的值表达在一个直接的新声明符为零,分配函数被调用,以没有元素分配一个数组.
因此,您的代码分配一个数组,其行为在任何方面都像任何其他T数组一样(可以使用delete []删除,作为参数传递,可能是其他事情).但是,它没有可访问的索引(即,读取或写入ptr [0]会导致未定义的行为).
在这种情况下,constant-expression和表达式之间的区别不在于实际表达式是编译时间常量(显然是0),而是它是否指定了多维数组的"最后"维度.语法在5.3.4:1中定义.