5

可能重复:
C++ 中的对象破坏

假设我们有两个类,一个被调用Array,另一个被调用MessageOnExit

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

以下是课程:

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

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

以下是使用这些类的“主要” :

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

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

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

现在当main执行完成时,静态成员的值counter-1跟随析构函数调用(在 a1、a2 和 a3 被销毁之后),然后message将调用析构函数,打印该值(-1)。

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

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

总而言之,无论我做什么更改,当程序终止消息析构函数成功访问静态成员时counter,我不明白为什么会这样。据我了解,如果message首先定义全局对象,则其析构函数将最后调用,因此该counter值将不可用于其析构函数。

提前致谢!盖伊

4

1 回答 1

7

标准第 3.8 节说:

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

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

  • 对象占用的存储空间被重用或释放。

Nowint不是类类型,并且由于Array::counter具有静态存储持续时间,因此它的存储永远不会被释放。所以生命周期Array::counter永无止境,你可以从任何你想要的析构函数中安全地访问它!

于 2013-01-16T16:50:04.057 回答