析构函数会销毁静态成员吗?

14

假设我有:

class A
{
    A()
    {}
    ~A()
    {}
};

class B
{
public:
    B()
    {}
    ~B()
    {}
private:
    static A mA;
};

B* pB = new B; 
delete pB;

当我调用delete pB时,B的析构函数将被调用。这是否会再调用静态成员A的析构函数?


2
也许你的问题是 "静态成员何时被销毁"? - Alexander Malakhov
6个回答

24

关键字 "static" 意味着该变量独立于实例。这就是为什么您可以在没有首先实例化类中的对象的情况下访问静态变量和方法。这也是为什么销毁实例不会影响任何静态变量。


12
当然不会。首先,你已经定义了一个显式的空析构函数。如果默认析构函数这样做了,你就不能销毁实例而不冒使类无法使用的风险。

3
有一个显式的空析构函数存在并不重要。 - Dennis Zickefoose

8

C++标准03,9.4.2 静态数据成员:

静态数据成员不是类的子对象的一部分。一个静态数据成员只有一个副本,由该类的所有对象共享。

静态数据成员不是类的一部分,因此它不与类的生命周期相关,也不会在构造或销毁时被调用。

构造 (9.4.2/3)

一旦定义了静态数据成员,即使没有创建该类的任何对象,它也存在。

销毁 (9.4.2/7)

静态数据成员的初始化和销毁与非局部对象完全相同。


1

具有静态生命周期的对象将在应用程序终止时被销毁。在程序中可能存在各种静态对象,析构函数按照对象构造的相反顺序调用。

对象实例的构建/销毁对静态成员的构建或销毁时间没有影响。


静态数据成员的析构函数真的会在程序终止时被调用吗? - Vassilis

1

静态成员不属于类的实例分配的内存空间。因此,除非您在代码的任何部分(包括类析构函数)中显式地删除或取消初始化它,否则它将不会被删除或取消初始化。但是,您的代码逻辑必须处理可能存在多个实例的情况等等...


1

静态变量也被称为类变量。与实例变量相对应。正如这些名称所示,类变量属于整个类,而实例变量属于实例。可以根据这些事实推导出这些变量的生命周期。

另一种看待这一点的方式是假设调用析构函数会实际销毁静态变量。然后想象一下,一个对象被实例化并被删除后发生了什么。这时其他仍在使用的类的所有其他对象共享的静态变量会发生什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接