C ++是否为全局和类静态变量调用析构函数?

时间:2010-02-05 02:01:08

标签: c++ global-variables destructor

从我的示例程序中看起来它在两种情况下都会调用析构函数。它在什么时候调用全局变量和类静态变量的析构函数,因为它们应该在程序堆栈的数据部分中分配?

2 个答案:

答案 0 :(得分:61)

来自C ++ 03标准的第3.6.3节:

  

静态存储持续时间的初始化对象(在块作用域或命名空间作用域声明)的析构函数(12.4)作为从main返回并由于调用exit(18.3)而被调用。这些对象以其构造函数完成或动态初始化完成的相反顺序销毁。如果对象是静态初始化的,则对象的破坏顺序与对象动态初始化的顺序相同。对于数组或类类型的对象,在构造子对象期间初始化静态存储持续时间的任何本地对象被销毁之前,该对象的所有子对象都将被销毁。

此外,§9.4.27指出:

  

静态数据成员的初始化和销毁​​与非本地对象(3.6.2,3.6.3)完全相同。

但是,如果析构函数没有可观察的行为,则可能无法调用它。 Terry Mahaffey在他的answer to "Is a C++ destructor guaranteed not to be called until the end of the block?"中详细说明了这一点。

答案 1 :(得分:2)

在“主要”之后的某个地方

(你无法知道或依赖于他们的确切顺序)