C++:成员指针初始化?

Dan*_*iel 10 c++ pointers default

代码示例应该解释一下:

class A
{
    B* pB;
    C* pC;
    D d;

    public : 
    A(int i, int j) : d(j)
    {
        pC = new C(i, "abc");
    } // note pB is not initialised, e.g. pB(NULL)

    ...
};
Run Code Online (Sandbox Code Playgroud)

显然,pB应该明确地初始化为NULL以保证安全(并且清晰),但是,就目前而言,构建A之后pB的值是多少?是否默认初始化(为零?)或不是(即不确定和内存中的任何内容).我意识到C++中的初始化有一些规则.

我认为它不是默认初始化的; 在Visual Studio中以调试模式运行时,它已将pB设置为指向0xcdcdcdcd - 这意味着内存已经新(在堆上)但未初始化.但是在释放模式下,pB始终指向NULL.这只是偶然的,因此不能依赖; 或者这些编译器是否为我初始化(即使它不在标准中)?在Solaris上使用Sun编译器编译时,它似乎也是NULL.

我真的在寻找标准的具体参考来说明这种或那种方式.

谢谢.

Gre*_*ers 11

以下是他标准的相关段落:

12.6.2初始化基数和成员[class.base.init]

4如果给定的非静态数据成员或基类未
在mem-initializer-list中由mem-initializer-id 命名,则

- 如果实体是(可能是cv限定的)类类型(或其数组)或基类的非静态数据成员,并且实体类是非POD类,则该实体是默认初始化的(dcl.init).如果实体是const限定类型的非静态数据成员,则实体类应具有用户声明的默认构造函数.

- 否则,实体未初始化.如果实体具有const限定类型或引用类型,或者包含(直接或间接)const限定类型成员的(可能是cv限定的)POD类类型(或其数组),则该程序为形象不对.

对类X的构造函数的调用完成后,如果是成员

X既没有在构造函数的mem-initializers中指定,也没有
默认初始化,也没有在
构造函数体的执行期间初始化,该成员具有不确定的值.

  • 所以它没有初始化,可以指向任何东西.内容可以由实现填充,即fdfdfdfd用于debugheap库. (2认同)