8

我正在查看一些遗留代码并遇到了x=new(Foo);(注意提供的类型周围的括号)。我测试了变化,它似乎与x=new Foo;

Foo 是一个非 POD 数据结构。一些外部内存泄漏程序正在标记该行 - 它正在为 CORBA out 参数分配内存,因此调用者应该负责删除,但这是多层间接的单独问题。

我的分析是否正确,风格是否可接受?

4

2 回答 2

10

这是正确的,但风格至少是不寻常的。

有时允许在完整类型名称周围使用括号,但在这种情况下是无关的。这就像在不需要的表达式周围加上括号。也许最接近的类比是

return( 0 ); /* looks like a function, but isn't */

令人困惑的是,sizeof运算符需要括号,在传递类型名称时而不是在传递表达式时。我个人认为这是一种不一致,并且不会选择将其传播到语言的其他部分。

于 2013-01-16T00:28:48.057 回答
5

如果类型的名称有括号,则必须将其括在括号中。也可以包含其他类型。

需要括号的示例:

new int(*[10])();    // parser error: parsed as (new int) (*[10]) ()
new (int (*[10])()); // OK: allocates an array of 10 pointers to functions

来自cppreference.com:新表达式

于 2013-01-16T00:44:51.187 回答