C++中,new int和new (int)有什么区别?

22

什么是两者之间的区别?

int * num = new (int);

并且

int * num = new int;

有什么区别吗?

编辑 谢谢大家。...哪个答案是最正确的?

5个回答

15

在您的示例中(使用int类型),上下文中没有区别。但是,如果您需要创建复合类型的对象,则需要使用括号版本。例如:

int (**fn_ptr_ok) ()  = new (int (*[10]) ()); // OK
int (**fn_ptr_err) ()  = new int (*[10]) (); // error 

这是一个包含10个指向返回int且不带参数的函数指针的数组。请查看此链接:http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html - sinek

10
在这种特殊的情况下,两者没有任何区别。只是第一种语法很少使用,可能是因为它看起来不方便和晦涩,并且需要更多的打字!

6

当您想创建动态数组时,还有另一个区别。

int n = 2;
int *p = new int[n]; // valid
int *q = new (int[n]); // invalid

括号中的版本需要一个常量大小。

1
第二个,你仍然需要使用 delete[],是吗? - CB Bailey
@Charles 是的,你需要使用 delete[] - Johannes Schaub - litb
如果 n 是常量,那么第二个就相当于为一个对象(而不是 n 个)分配空间,该对象具有与 int arr[n] 完全相同的类型?对吗? - UmmaGumma
@Ashot,第二个,如果n是常量,与第一个完全等效。它只需要n是常量。在这两种情况下,都创建了一个对象(数组对象),其中包含n个对象。在这方面,括号没有不同的含义。 - Johannes Schaub - litb

2

虽然这不是一个答案,但我无法将其放入评论中。

由于“placement new”的存在,它变得更加复杂: http://codepad.org/pPKt31HZ

#include <stdio.h>

void* operator new( size_t N, int x ) {
  return new char[N];
}

int main( void ) {
  int x = int();
  int* a = new( int() ) int;
}

有趣的是gcc可以接受这个,但MS/Intel不行。


2
在这个问题的情况下,这两个new的含义是相同的。从语法上讲,前者new ()的操作数是类型标识符,而后者的操作数是新类型标识符。对于新类型标识符,如果(....)出现在操作数的后面,则被解释为构造函数的参数列表。也就是说,如果我们写new int(1),那么int将被初始化为1。另一方面,对于类型标识符,如果(....)出现,则它是类型的一部分。例如,当我们new一个指向函数的指针时,我们必须使用new( type-id )形式。例如,如new( int(*)() )

1
我想我理解了你想说什么。我对自己的心灵读取技巧感到相当自豪。 - log0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接