从我的示例程序看,在两种情况下看起来都会调用析构函数.它在什么时候调用全局变量和类静态变量的析构函数,因为它们应该在程序堆栈的数据部分中分配?
可能重复:
C++中的对象销毁
假设我们有两个类,一个被调用Array,另一个被调用MessageOnExit.
假设Array该类有一个名为的静态数据成员counter.
以下是课程:
class Array {
public:
static int counter;
Array(){counter++;}
~Array(){counter--;}
};
class MessageOnExit {
public:
~MessageOnExit(){cout << Array::counter;}
};
Run Code Online (Sandbox Code Playgroud)
以下是使用这些类的"主要":
// static variable definition
int Array::counter;
// global object definition
MessageOnExit message;
void main() {
Array a1, a2;
Array a3(a1);
}
Run Code Online (Sandbox Code Playgroud)
前两个声明将更改为counter2,然后两次调用Empty/Default构造函数.第三个声明不会更改,counter因为将调用Default复制构造函数.
现在main执行完成后,静态成员的值counter将-1随后是析构函数调用(在a1,a2和a3被去除后),然后message将调用析构函数,打印此值(-1).
我的问题是counter,当message调用析构函数时,我们如何知道静态成员仍然存在且可用.
此外,如果我更改静态/全局对象/变量定义顺序,即message之前定义counter …