“new int[];”是什么意思?

4
这行代码是做什么的?
new int[];

根据我的编译器反汇编结果(VC++ 2012),它所做的与以下代码相同:
new int[0];

但这是否被C++标准规定?这是一条合法的指令吗?


5
"Lightning doesn't strike twice and all" 的意思是某件事情发生一次就不会再次发生。 https://dev59.com/aXNA5IYBdhLWcg3wHp-B 这个问题是在问在 C++ 中使用 new int[0] 语句是否会分配内存。 - Yann
1
听起来像是一个错误或扩展的问题。 - user3920237
5
一道关于new int[]的问题怎么可能成为一个关于new int[0]的重复问题,毕竟前者在后者中从未提及? - Angew is no longer proud of SO
1
哦不,除了愚蠢的投票之外,现在还选择了一个错误的答案作为“解决方案”。@NPS:请重新考虑你的选择。通过谷歌搜索到这里的人将因当前的选择而受到误导。 - Cheers and hth. - Alf
2
据我所知,“new int[];”是不合法的。如果您坚信它是合法的,请提供您自己的答案并引用标准 - 我很乐意重新考虑我的选择。@Cheersandhth.-Alf - NPS
显示剩余4条评论
2个回答

8

new int[]表达式在C++11中无效(我没有检查过C++14)。

使用单个[]语法需要在方括号之间放置一个(隐式转换为)整数类型的表达式,表示所需的数组大小。

请注意,这个大小不一定是常数:在抽象层次的底层,这是你在C++中分配动态数组的方法。


C++11(通过N3290 final draft)§5.3.4/6:

noptr-new-declarator中的每个constant-expression都必须是整数常量表达式(5.19),并且求值为严格正值。noptr-new-declarator中的表达式应为整数类型,未作用域枚举类型或仅存在单个非显式转换函数以将其转换为整数或未作用域枚举类型的类类型(12.3)

第一个[]方括号中使用expression。在随后的[]方括号中,必须使用constant-expression(在编译时已知的值),因为外部数组维度的寻址需要已知大小的数组项。


当然,与其直接使用new,你通常最好使用std::vector(或者也许是std::string)。


或者使用 std::dynarraystd::valarray,它们都是非常棒的连续容器。 - Yakk - Adam Nevraumont
@Yakk:嗯,没有std::dynarray。有std::valarray,但它很少被使用。据报道,这个设计是不完整的,但它还是以某种方式出现在C++98中。 - Cheers and hth. - Alf

7
new int[]; 

不合法。

根据草案标准n3337 § 5.3.4,[]的第一个维度应该是一个表达式,每个后续维度(如果有)应该是一个常量表达式,遵循下面的语法规定:

noptr-new-declarator:
     [ expression ] attribute-specifier-seqopt
     noptr-new-declarator [ constant-expression ] attribute-specifier-seqopt

在此,每个constant-expression都应该是一个转换为std::size_t类型的转换常量表达式,如第6条所述:

noptr-new-declarator中的每个constant-expression都应该是一个转换为std::size_t类型的转换常量表达式(5.19),并且其值应该严格为正。在一个noptr-new-declarator中的expression会被隐式转换为std::size_t。


1
“应该有一个常量表达式”是不正确的。任何人只要稍微反思一下就可以理解。比如,大约1秒钟左右。 - Cheers and hth. - Alf
2
@remyabel const-expression 的意思就是它的字面意思。但只有在动态分配数组时才需要使用,例如 new int[i][5]; 这意味着你不能在 5 的位置上使用非常量表达式。 - jrok
1
@Cheersandhth.-Alf 我不是 C/C++ 专家,也没有任何近期成为专家的意图,请添加您自己的答案或编辑此答案。否则我很乐意删除并学习更多,谢谢! - P0W
@Cheersandhth.-Alf 现在应该公平地取消你的负评了 :) - jrok
@jrok:通常当一个答案被更正后,我会将其取消踩。我甚至在评论中做出了说明。但是这里的标准引用没有署名,并且与我的C++11不匹配。我猜它是C++14或其他版本。我会等到它被更正或署名之后再进行评价。 - Cheers and hth. - Alf
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接