问题来自我最近提出的另一个问题Referencing a possibly destroyed static object。类的实例的析构函数是否可以使用全局原始变量/常量?是否保证在程序终止之前保持其价值(即在静力学被破坏之后)?
我知道没有定义编译单元之间的静态对象破坏,但我想知道原始值是否也是如此。
例如
extern bool global_boolean_value;
Something::~Something() {
assert(global_boolean_value);
}
答案 0 :(得分:2)
关于初始化,标准将具有“静态存储持续时间”的所有内容整合在一起,这是使用static
关键字声明的变量(包括成员变量)(具有内部链接的变量)以及“真正的全局变量” (具有外部链接的变量)。该标准不区分普通旧数据类型和结构或类别。
评论后注意(2012年标准的所有引用):
3.7.1静态存储持续时间[basic.stc.static]
1所有没有动态存储持续时间,没有线程存储持续时间且不是本地的变量都具有静态存储持续时间。这些实体的存储应该持续计划的持续时间(3.6.2,3.6.3)。
(我强调。)POD和非POD之间没有区别。请注意,该段落定义了存储的生命周期,而不是(类型化,初始化)对象的生命周期。当程序(不 main()
!)启动时,可以轻松分配所有静态存储。是的,具有静态存储持续时间的对象的析构函数是程序的一部分。据我所知,这使得在析构函数中访问errno
是安全的。
正如您所说,无法保证在不同的翻译单元中具有静态存储持续时间的对象的初始化顺序; 在一个TU中,初始化是在定义顺序,然后按相反的顺序进行销毁。
这就是它的全部内容(除了变通方法,比如将你的全局变量放在一个人工类中或从函数中返回static
局部变量)。
然后,您的示例问题的答案取决于调用析构函数的对象的存储持续时间。如果对象具有静态存储持续时间并且位于不同的翻译单元中,那么您就不走运了。如果它是自动或动态分配的,或者它是在全局变量之后在同一个翻译单元中定义的那么你就可以了。