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

Why instance of class with user defined destructor has member pointer set to zero?

本文关键字:成员 指针 设置 实例 用户 定义 析构函数 为什么      更新时间:2023-10-16

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

#include <stdio.h>
struct A
{
    int *p;
    ~A(){};
};
struct B
{
    int *p;
};
int main()
{
    A a;
    printf("a.p=%pn", a.p);
    B b;
    printf("b.p=%pn", b.p);
}

输出为:

a.p=00000000
b.p=7667ADF9
使用GCC版本3.4.5 (mingw-vista special r3)。

值未定义。巧合的是,a是零。

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

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

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

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