全局对象和静态变量之间的破坏顺序是什么?

时间:2013-01-16 16:32:37

标签: c++

  

可能重复:
  Object destruction in C++

假设我们有两个类,一个叫Array,另一个叫MessageOnExit

假设Array类有一个名为counter的静态数据成员。

以下是课程:

class Array {
public:
    static int counter;
    Array(){counter++;}
    ~Array(){counter--;}
};

class MessageOnExit {
public:
    ~MessageOnExit(){cout << Array::counter;}
};

以下是使用这些类的“main”

// static variable definition
int Array::counter;
// global object definition
MessageOnExit message;

void main() {
    Array a1, a2;
    Array a3(a1);
}

前两个声明会将counter更改为2,然后两次调用Empty / Default构造函数 第三个声明不会更改counter,因为将调用默认复制构造函数。

现在main执行完成后,静态成员counter的值将为-1随后的析构函数调用(在a1,a2和a3被去除后),然后将调用message析构函数,打印此值(-1)。

我的问题是,当调用counter析构函数时,我们如何知道静态成员message仍然存在且可用。

此外,如果我更改静态/全局对象/变量定义顺序,即在message之前定义counter,则值仍为-1

总结一下,无论我做什么改变,当程序终止消息析构函数成功访问静态成员counter时,我不明白为什么会这样。据我所知,如果首先定义全局对象message,它的析构函数将被最后调用,因此counter值将不可用于其析构函数。

提前致谢! 盖

1 个答案:

答案 0 :(得分:6)

标准部分3.8说:

  

类型T的对象的生命周期在以下时间结束:

     
      
  • 如果T是具有非平凡析构函数(12.4)的类类型,则析构函数调用开始,或

  •   
  • 重复使用或释放​​对象占用的存储空间。

  •   

现在int不是类类型,并且由于Array::counter具有静态存储持续时间,因此永远不会释放其存储。因此Array::counter的生命周期永远不会结束,您可以从任何想要的析构函数中安全地访问它!