C++ 在不指定大小的情况下分配动态数组是否是格式良好的代码?
下面的简单程序段给出了C++ 在不指定大小的情况下分配动态数组是否是格式良好的代码?,c++,new-operator,language-lawyer,C++,New Operator,Language Lawyer,下面的简单程序段给出了gcc-4.3.4的编译错误 节目: int main() { char *ptr = new char[10]; char *ptr1 = new char[]; return 0; } 编译错误: int main() { char *ptr = new char[10]; char *ptr1 = new char[]; return 0; }
gcc-4.3.4
的编译错误
节目:
int main()
{
char *ptr = new char[10];
char *ptr1 = new char[];
return 0;
}
编译错误:
int main()
{
char *ptr = new char[10];
char *ptr1 = new char[];
return 0;
}
prog.cpp:在函数“int main()”中:prog.cpp:4:错误:在']'标记之前应该有主表达式
程序cpp:3:警告:未使用的变量“ptr”
程序cpp:4:警告:未使用的变量“ptr1” 但是使用MSVC也可以干净地编译,而不需要任何诊断消息 所以我的问题是:
标准是否允许在不指定
大小的情况下调用新[]
?或者这是MSVC中的一个bug?
是否有人能提供标准的参考,该标准最终会说上述代码示例的格式不正确或格式良好
我看了一下:
5.3.4新增[expr.New]和
18.4.1.2数组表单[lib.new.delete.Array]
但是找不到任何关于这种行为的确凿证据
编辑:
添加语言律师
标记。
我期待着一个观察到的行为的答案,不管它是否有用,我完全知道它没有用处,也不推荐。这在语法上是不正确的
请查看以获取新表达式
一个NoptR新的声明符必须包含方括号之间的表达式,表达式中必须有一个令牌。
< P>这不是合法的C++。
5.3.4 New[expr.New]显示了在一个大列表中调用New的合法方式,其中包含以下行:
noptr-new-declarator:
[ expression ] attribute-specifier-seqopt
noptr-new-declarator [ constant-expression ] attribute-specifier-seqopt
随后解释了常量表达式可以是什么(在5.4.3/6和5.4.3/7中):
noptr新声明符中的每个常量表达式应为积分常量表达式(5.19),并计算为严格正值
经过一些思考,接下来的项目应该是相关的:
8.3.4/1[dcl.数组],这些部分:
在声明T D中,其中D的形式为
声明T D1中标识符的类型为“派生声明器类型列表T”,则D标识符的类型为数组类型
及
如果省略常量表达式,则D标识符的类型为“派生声明器类型-T的未知边界列表数组”,这是一种不完整的对象类型
5.3.4/1讲述:
此类型应为完整的对象类型,但不是抽象类类型或其数组
因为你忽略了数组大小,类型不完整,程序不合法C++。/P>如果它合法,我看不出它的要点……我不知道它是如何形成代码的?编译器将要做什么,猜猜大小?这似乎相当困难(如果不是不可能)。+1,很有趣,正在等待一个好的答案。
newchar[]
分配内存吗?我认为它只会在第一行创建一个指针。该方法适用于多维数组。例如x=new char[plop*5/*expression*/][10/*const expression*/][100/*const expression*/]
快速一瞥,我看不出是空的,但?@LokiAstari这就是为什么我添加了常量表达式可以编辑的内容:noptr新声明符中的每个常量表达式都应该是一个整型常量表达式。因为它在问题中被省略,那么它不是标准的C++,而是编译器扩展。它不是UB,因为它可以编译,但它不应该。@VJovic:因为程序违反了语法规则,所以需要进行诊断;不发出诊断的编译器是不一致的。但合格的编译器在发出诊断后仍然可以接受它(警告就足够了)。一旦它被接受,程序的行为就没有定义(因为标准中没有定义它的行为)。@LokiAstari:只有当它是一个文档化的扩展时。通过发布诊断,编译器已经履行了对标准的承诺。(“实现定义”意味着实现必须记录行为。)