Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在不指定大小的情况下分配动态数组是否是格式良好的代码?_C++_New Operator_Language Lawyer - Fatal编程技术网

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:只有当它是一个文档化的扩展时。通过发布诊断,编译器已经履行了对标准的承诺。(“实现定义”意味着实现必须记录行为。)