我对值-& 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 函数是用户声明的,并且在第一次声明时没有显式默认或删除,那么它是用户提供的。林克)