在销毁或卸载期间存储全局变量

时间:2013-10-12 07:02:38

标签: c++ static global-variables destructor

我不清楚是否可以重用或释放静态全局变量的存储,尤其是在调用其他对象的全局析构函数之后。

如果在一个文件中我有:

static int a; //假设a的值将在程序期间的某个时间发生变化

int getA(){return a; }

在另一个档案中:

extern int getA();

B级{

公共:

~B() { if (getA() ==..... }

};

静态B b;

在~B()中引用getA()总是安全的(考虑到全局析构函数的顺序在翻译单元之间可能是未定义的),或者“a”的存储是否可以在某个时刻由运行时释放或重用?

我知道在初始化全局变量期间,有两个阶段,静态和动态,在静态阶段,它们的内存用0填充,并且在动态阶段构造函数被调用。对于最终化和卸载,有没有相反的东西?

C ++标准是否对此有所说明?

2 个答案:

答案 0 :(得分:0)

简短的回答是否定的。它是程序的.data或.bss部分的一部分。

当然,如果您知道地址并希望使用该空间,则可以“非法”重复使用。但它始终存在。从头到尾。

答案 1 :(得分:0)

  

我不清楚静态全局变量的存储是否可以   重用或释放,特别是在其他的全局析构之后   对象被称为。

如果你的意思是内存存储,它永远不会'释放'(从进程内存空间中取消映射)

  

在~B()中引用getA()总是安全的(考虑到。的顺序)   全局析构函数可能在翻译单元之间未定义)或者可以   “a”的存储由某些运行时释放或重用   点?

是。 int a是POD,它没有ctor。

  

我知道在全局变量初始化期间有2个   阶段,静态和动态,在静态阶段,它们的内存被填充   0和动态阶段期间调用构造函数。在那儿   最终完成和卸载的反向是什么?

从程序的角度来看,您可能只是忽略静态阶段。你提到的'卸载'通常由内核完成。在Linux中,它位于exit_group / _exit系统调用