为什么具有用户定义的析构函数的类的实例将成员指针设置为零?

时间:2014-06-17 08:42:59

标签: c++ destructor

为什么具有用户定义的析构函数的类的实例将成员指针设置为零,而没有用户定义的析构函数的类不设置默认指针值?

#include <stdio.h>

struct A
{
    int *p;
    ~A(){};
};

struct B
{
    int *p;
};

int main()
{
    A a;
    printf("a.p=%p\n", a.p);

    B b;
    printf("b.p=%p\n", b.p);
}

输出结果为:

a.p=00000000
b.p=7667ADF9

*使用gcc版本3.4.5(mingw-vista special r3)。

2 个答案:

答案 0 :(得分:1)

值未定义。 a为零是巧合。

您正在获取堆栈上的值,并且纯粹的机会是,第一个变量a的内部值由运行main的代码始终保留为0x00000000的值。但是,这完全依赖于代码的实现,并且它没有定义,当然也不可移植。正确的做法是将指针初始化为构造函数中的已定义值或通过默认初始化。

回答你的问题:没有区别,你正在观察副作用。如果从A中删除析构函数并向B添加一个析构函数,则值不会更改。 (即a.p仍为0)

答案 1 :(得分:0)

它没有。指针具有未指定的值。如果你看到零,那么这只是纯粹的机会。

请注意,读取此未初始化的值实际上具有未定义的行为,因此您可以在左眼睑后面看到超新星形式,而不是看到任何数字。