我不清楚是否可以重用或释放静态全局变量的存储,尤其是在调用其他对象的全局析构函数之后。
如果在一个文件中我有:
static int a; //假设a的值将在程序期间的某个时间发生变化
int getA(){return a; }
在另一个档案中:
extern int getA();
B级{
公共:
~B() { if (getA() ==..... }
};
静态B b;
在~B()中引用getA()总是安全的(考虑到全局析构函数的顺序在翻译单元之间可能是未定义的),或者“a”的存储是否可以在某个时刻由运行时释放或重用?
我知道在初始化全局变量期间,有两个阶段,静态和动态,在静态阶段,它们的内存用0填充,并且在动态阶段构造函数被调用。对于最终化和卸载,有没有相反的东西?
C ++标准是否对此有所说明?
答案 0 :(得分:0)
简短的回答是否定的。它是程序的.data或.bss部分的一部分。
当然,如果您知道地址并希望使用该空间,则可以“非法”重复使用。但它始终存在。从头到尾。
答案 1 :(得分:0)
我不清楚静态全局变量的存储是否可以 重用或释放,特别是在其他的全局析构之后 对象被称为。
如果你的意思是内存存储,它永远不会'释放'(从进程内存空间中取消映射)
在~B()中引用getA()总是安全的(考虑到。的顺序) 全局析构函数可能在翻译单元之间未定义)或者可以 “a”的存储由某些运行时释放或重用 点?
是。 int a是POD,它没有ctor。
我知道在全局变量初始化期间有2个 阶段,静态和动态,在静态阶段,它们的内存被填充 0和动态阶段期间调用构造函数。在那儿 最终完成和卸载的反向是什么?
从程序的角度来看,您可能只是忽略静态阶段。你提到的'卸载'通常由内核完成。在Linux中,它位于exit_group / _exit系统调用
中