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

C++ C++;:成员指针初始化?,c++,pointers,default,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) ... }; 显然,pB应该显式初始化为NULL以确保安全(和清晰),但是,就目前情况而言,构造A后pB的值是多少?它是

代码示例应该解释以下内容:

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)

    ...
};
显然,pB应该显式初始化为NULL以确保安全(和清晰),但是,就目前情况而言,构造A后pB的值是多少?它是否默认初始化(为零?)(即不确定和内存中的任何内容)。我意识到C++中的初始化规则很少,

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

我真的在寻找一个特定的参考标准,以这样或那样的方式说


谢谢。

我相信这是旧C时代的产物,那时你对所有的记忆都没有期望。随着标准发展到C++,这种“惯例”得以保持。随着C++编译器的发展,各个作者都开始自己“修复”这个问题。因此,根据您选择的编译器,您的里程数可能会有所不同

“0xCDCD”看起来是一种易于识别的模式,它“有助于”调试代码。这就是为什么它不会在发布模式下显示


我希望这有点帮助,祝你好运。

没有经验的指针可以指向任何东西。一些编译器供应商会帮助您,让他们指向0或0xCDCD或其他任何东西

为了确保代码的安全性和可移植性,您应该始终初始化指针。设置为0或设置为有效值

e、 g

如果始终初始化指向0的指针,则这是安全的:

if (!pc) 
    pc = new C(...);
如果不初始化,那么就无法区分初始化指针和未初始化指针


作为一个旁白,C++中没有这样的关键字作为null。大多数编译器将NULL定义为0,但使用它并不被认为是可移植的。新的c++0x标准将引入一个新的关键字nullptr,因此当它出现时,我们最终将拥有一个可移植的空指针常量。

pB的值未定义。它可能是相同的值,也可能不是一致的值-通常取决于在分配特定的a实例之前,内存中相同位置的内容。

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

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

4如果给定的非静态数据成员或 基类不是由mem命名的-
中的初始值设定项id mem初始值设定项列表,然后

--如果实体是非静态数据 成员(可能具备简历资格) 类类型(或其数组)或基类,以及实体类 是非POD类,实体默认初始化(dcl.init)。 如果实体是常量限定类型的非静态数据成员, 实体类应具有用户声明的默认构造函数

--否则,该实体不可用 已初始化。如果该实体是 常量限定类型或引用类型,或(可能是cv限定类型)- (d)吊舱类类型(或其阵列)包含(直接或间接) 间接地)一个const限定类型的成员,程序是 病态- 形成

在调用 如果是成员,则类X已完成

中既没有指定X的值 构造函数的mem初始值设定项,nor
默认已初始化,也未初始化 执行
构造函数,该成员具有 不确定值


未初始化的指针基本上允许包含随机值,尽管有些编译器倾向于用0或其他可识别的值填充它们,特别是在调试模式下


我想这是由于C++的“不为你不使用的东西付费”设计。如果你不认为它很重要,编译器不需要花费你初始化变量的代价。当然,一旦你追踪了一个随机指针,你可能会发现下次对它进行初始化是明智的…

根据第12.6.2.4节,在指针变量的情况下,如果你没有将它包括在初始化列表中,也没有在构造函数体中设置它,那么它的值是不确定的。0xCDCD和0是两个可能的值,其他值也是一样。:-)

我建议您不要学习您正在使用的语言,但在这种情况下,pB是否初始化并不是有用的信息。只需初始化它。如果它是自动初始化的,编译器将优化额外的初始化。如果不是,你就添加了一个额外的处理器指令,防止了一系列潜在的错误。

不确定(和一些编译器会警告),但是我没有C++标准HANY…B是一个随机指针到野外。注意。在调试模式下,大多数编译器会将其初始化为NULL(据说是为了帮助调试)。但在释放模式下,它将具有以前存储在内存中的值。你不是说,“不要为你不使用的东西付费”吗?因此它未初始化,可以指向任何东西。内容可能由实现填充,即debugheap库的fdfd。@xtofl您的注释非常混乱!pB是一个非静态数据成员,因此,根据上面引用的密码,它是默认初始化的!(?)它不是类类型,而是指针类型。粗体文本适用。
C* pc = new C(...);
if (!pc) 
    pc = new C(...);