2013-01-16 71 views
8

我正在查看一些遗留代码,并遇到了x=new(Foo);(注意围绕所提供的类型的括号)。我测试了变体,它看起来与x=new Foo;相同对于任意Foo,“x = new(Foo)”与“x = new Foo”相同吗?

Foo是一个非POD数据结构。一些外部内存泄漏程序正在标记该行 - 它为CORBA输出参数分配内存,因此调用者应该照顾删除操作,但这与许多间接层有关。

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

回答

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: new expression

10

这是正确的,但风格至少与众不同。

有时允许围绕完整类型名称的括号,但在这种情况下是无关紧要的。这就像将括号放在不需要的表达式附近。也许是最接近的类比是

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

令人困惑的是,在括号是必需的sizeof运营商,通过它当一个类型名称,但不是传递一个表达式时。就我个人而言,我认为这是不一致的,并且不会选择将其传播到其他语言。

+4

这就是我想太多,但事实证明,它必须比这更微妙。例如,下面的代码不能编译:'(int)main(){return 0; }'。 –

+3

不正确,通常不允许使用类型的括号。 – zch

+2

@zch然后,是否有一个(没有参考砰砰声,虽然我感觉到这一点)短括号括号*是*允许类型周围吗? – 2013-01-16 00:33:20

相关问题