假设我们有两个类,一个叫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
值将不可用于其析构函数。
提前致谢! 盖
答案 0 :(得分:6)
标准部分3.8说:
类型
T
的对象的生命周期在以下时间结束:
如果T是具有非平凡析构函数(12.4)的类类型,则析构函数调用开始,或
重复使用或释放对象占用的存储空间。
现在int
不是类类型,并且由于Array::counter
具有静态存储持续时间,因此永远不会释放其存储。因此Array::counter
的生命周期永远不会结束,您可以从任何想要的析构函数中安全地访问它!