0

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

如果在一个文件中我有:

静态整数一个;//假设a的值会在程序中的某个时间发生变化

int getA() { 返回一个;}

在另一个文件中:

外部 int getA();

B类{

上市:

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

};

静态 B b;

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

我知道在全局变量的初始化过程中有两个阶段,静态和动态,在静态阶段,它们的内存被 0 填充,在动态阶段构造函数被调用。是否有类似的反向完成和卸载?

C++ 标准对此有什么说法吗?

4

2 回答 2

0

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

当然,如果您知道地址并想使用该空间,则可以“非法”重复使用它。但它总是在那里。从开始到结束。

于 2013-10-12T07:10:11.163 回答
0

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

如果您的意思是内存存储,它永远不会“释放”(未从进程内存空间映射)

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

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

我知道在全局变量的初始化过程中有两个阶段,静态和动态,在静态阶段,它们的内存被 0 填充,在动态阶段构造函数被调用。是否有类似的反向完成和卸载?

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

于 2013-10-12T07:41:22.047 回答