我正在查看一些旧代码,发现了x=new(Foo);
(请注意提供的类型周围的括号)。 我尝试了一些变化,似乎与x=new Foo;
相同。
Foo是一个非POD数据结构。一些外部内存泄漏程序正在标记该行 - 它正在为CORBA输出参数分配内存,因此调用者应该负责删除,但这是一个具有多层间接性的单独问题。
我的分析正确吗?这样的编码风格是否可接受?
我正在查看一些旧代码,发现了x=new(Foo);
(请注意提供的类型周围的括号)。 我尝试了一些变化,似乎与x=new Foo;
相同。
Foo是一个非POD数据结构。一些外部内存泄漏程序正在标记该行 - 它正在为CORBA输出参数分配内存,因此调用者应该负责删除,但这是一个具有多层间接性的单独问题。
我的分析正确吗?这样的编码风格是否可接受?
这种写法理论上是正确的,但至少不太常见。
在完整的类型名称周围添加括号有时是允许的,但在这种情况下是多余的。这就好像在不需要的地方将表达式括起来一样。也许最接近的类比可能是
return( 0 ); /* looks like a function, but isn't */
令人困惑的是,在向 sizeof
操作符传递类型名称时需要使用括号,但在传递表达式时不需要。个人认为这是一种不一致性,并且不会选择将其推广到语言的其余部分。
如果类型名称中有括号,则必须用括号将其括起来。其他类型也可以被括起来。
需要使用括号的示例:
new int(*[10])(); // parser error: parsed as (new int) (*[10]) ()
new (int (*[10])()); // OK: allocates an array of 10 pointers to functions
(int) main() { return 0; }
。 - Oliver Charlesworthnew
可能允许额外的括号来区分未加括号的类型名称和表达式的其余部分,但实际上它遵循最大匹配原则。嗯... - Potatoswatter