new int [10]()是否有效c ++?

时间:2010-03-18 08:35:21

标签: c++ arrays constructor initialization

在尝试回答this问题时,我发现代码int* p = new int[10]();可以很好地编译VC9编译器并将整数初始化为0.所以我的问题是:

  1. 首先是这个有效的C ++或者是 它是一个微软的扩展吗?
  2. 是否保证初始化全部 数组的元素?
  3. 另外,如果我有任何不同 做new int;还是new int();?是否 后者保证初始化 变量?

4 个答案:

答案 0 :(得分:29)

首先是这个有效的C ++还是微软扩展?

它在C ++中有效,标准的相关部分是5.3.4,第一段包含语法

是否可以保证初始化数组的所有元素?

是。第5.3.4 / 15段指出

  

创建类型为T的对象的new-expression初始化该对象,如下所示:

     

...

     
      
  • 如果new-initializer的格式为(),则该项值已初始化(8.5)
  •   

其中为POD初始化的值意味着零初始化。

另外,如果我做新的int有什么区别;或者新的int();?后者是否保证初始化变量?

是的,他们是不同的。根据上面引用的new int(),将初始化整数。在同一段的前一个块中:

  

如果省略new-initializer:

     
      
  • 如果T是(可能是cv限定的)非POD类类型(或其数组),则该对象是默认初始化的(8.5)。如果T是const限定类型,则底层类类型应具有用户声明的默认构造函数。

  •   
  • 否则,创建的对象具有不确定的值。如果T是const限定类型,或者包含(直接或间接)const限定类型成员的(可能是cv限定的)POD类类型(或其数组),则该程序格式不正确;

  •   

所以new int不会初始化内存。

答案 1 :(得分:2)

从标准来看。 “默认初始化T类型的对象意味着: - 如果T是非POD类类型 [像vector这样的情况],调用T的默认构造函数。“

构造函数表达式T()用于表示类型T的默认值,对于内置类型,它为零,用户定义类型的默认构造函数为零。构造POD()产生值初始化并根据标准,这导致所有成员和子成员默认构造或零初始化。

这就是为什么你的陈述是合法的,但按照标准初始化为零;需要一些详细的查找恕我直言。

但是,我在标准中找不到它定义内置类型的默认构造的含义。

修改: -

struct S { int x; };

void f () {
   S s1;       // s1.x is uninitialized here
   S s2 = S(); // s2.x is zero here
}

我认为我们经常自己解释应用于内置类型的默认构造意味着什么;因为C ++标准没有定义它(至少我找不到它)而且我记得 Stroustrup Josuttis 说它意味着T()被描述为对于内置类型,值初始化是“零转换为类型T ”。

由于int*是内置类型,因此它被初始化为零。

但我真的不确定。

答案 2 :(得分:1)

  1. 根据第5.3.4 / 1段这是有效的C ++,由于特殊的格式化,这里很难引用。

  2. 根据5.3.4 / 15,如果使用form(),则该项目已初始化,见第8.5段,但简短答案为是。

  3. 是的,第一种情况是变量不是值初始化并且可以是任何东西,在第二种情况下,它的值已初始化并且将为零。

答案 3 :(得分:0)

如果我有点猜测(如果我错了,我肯定会纠正的):

后者()执行值初始化(因为它在standardese中调用),这使得整数在这种情况下的值为0。

这是对标准(C ++ 03?)的一个相当新的补充,因此较旧的编译器可能不支持它,并使其保持单向化。

我记得在从MSVS 2003切换到2005(我认为)时会收到很多警告,编译器说“现在这个成员将被零初始化,而不是之前”。