我对值-& default-& zero 初始化非常困惑。 特别是当它们适用于不同的标准 C + + 03和 C + + 11(以及 C + + 14)时。
我引用并试图扩展一个真正好的答案 Value-/Default-/Zero-Init < em > C + + 98 和 < em > C + + 03 在这里,使它更一般,因为它将帮助很多用户,如果有人可以帮助填补所需的差距,以有一个好的概述什么时候发生?
简而言之,通过例子得出的完整见解:
有时候 new 操作符返回的内存会被初始化,有时候不会取决于你新建的类型是否是 POD (普通的旧数据),或者是否是一个包含 POD 成员并且使用编译器生成的缺省构造函数的类。
假设:
struct A { int m; };
struct B { ~B(); int m; };
struct C { C() : m(){}; ~C(); int m; };
struct D { D(){}; int m; };
struct E { E() = default; int m;}; /** only possible in c++11/14 */
struct F {F(); int m;}; F::F() = default; /** only possible in c++11/14 */
在 C + + 98编译器中,应该出现以下 :
new A
-不确定值(A
是 POD)new A()
-0-初始化new B
-缺省构造(B::m
未初始化,B
非 POD)new B()
-默认构造(B::m
未初始化)new C
-缺省构造(C::m
为零初始化,C
为非 POD)new C()
-默认构造(C::m
为零初始化)new D
-缺省构造(D::m
未初始化,D
非 POD)new D()
-默认结构?(D::m
未初始化)在一个符合 C + + 03的编译器中,事情应该是这样的:
new A
-不确定值(A
是 POD)A
,因为它是一个 POD,所以它是零初始化。B::m
,B
是非 POD)B
,它对所有字段进行零初始化,因为它的默认 ctor 是编译器生成的,而不是用户定义的。C
,它调用默认的 ctor (C::m
为零初始化,C
为非 POD)C
,它调用默认的 ctornew D
-缺省构造(D::m
未初始化,D
非 POD)new D()
-值初始化 D?,它调用默认的 ctor (D::m
未初始化)斜体值和? 是不确定的,请帮助纠正这一点: -)
在一个符合 C + + 11的编译器中,事情应该是这样的:
(请帮助,如果我开始在这里,它无论如何都会出错)
在一个符合 C + + 14的编译器中,事情应该是这样的: (请帮助,如果我开始在这里,它无论如何都会出错) (草案基于答案)
new A
-default-初始化 A
,编译器 gen.ctor,(使 A::m
未初始化)(A
是 POD)
值-初始化 A
,这是从 < em > [ dcl.init ]/8中的2. point 开始的零初始化
new B
-default-初始化 B
,编译器 gen.ctor,(使 B::m
未初始化)(B
是非 POD)
值-初始化 B
,它对所有字段进行零初始化,因为它的默认 ctor 是编译器生成的,而不是用户定义的。
默认初始化 C
,它调用默认的 ctor (C::m
为零初始化,C
为非 POD)
值-初始化 C
,它调用默认的 ctor
new D
-default-初始化 D
(D::m
未初始化,D
非 POD)
值-初始化 D
,它调用默认的 ctor (D::m
未初始化)
new E
-default-初始化 E
,它调用 comp.gen.ctor (E::m
未初始化,E 为非 POD)
值-初始化 E
,它从 [ dcl.init ]/8中的2点开始零初始化 E
)
new F
-default-初始化 F
,它调用 comp.gen.ctor (F::m
未初始化,F
非 POD)
值-初始化 F
,从1开始 默认初始化 F
。点(如果 F
ctor 函数是用户声明的,并且在第一次声明时没有显式默认或删除,那么它是用户提供的。林克)