c++ - 相对于类静态的原始全局变量的生命周期

标签 c++

问题来 self 最近提出的另一个问题 Referencing a possibly destroyed static object .类实例的析构函数可以使用全局原始变量/常量吗?它是否保证在程序终止之前保持其值(value)(即在静力学被破坏之后)?

我知道未定义跨编译单元的静态对象销毁,但我想知道是否同样适用于原始值。

例如

Something.cpp

extern bool global_boolean_value;

Something::~Something() {
    assert(global_boolean_value);
}

最佳答案

关于初始化,标准将所有内容与“静态存储持续时间”结合在一起,即使用 static 关键字声明的变量(包括成员变量)(具有内部链接的变量)以及“真正的全局变量”(具有外部链接的变量)。该标准一方面不区分普通旧数据类型,另一方面不区分结构或类。

评论后注意(所有引自 2012 标准):

3.7.1 Static storage duration [basic.stc.static]
1   All variables which do not have dynamic storage duration, do not have thread storage duration, and are not local have static storage duration. The storage for these entities shall last for the duration of the program (3.6.2, 3.6.3).

(我强调的。)POD和非POD之间没有区别。请注意,该段落定义了存储 的生命周期,而不是(类型化、初始化的)对象的生命周期。当程序(不是 main()!)启动时,所有静态存储都可以轻松分配。是的,具有静态存储持续时间的对象的析构函数是程序的一部分。据我所知,这使得在析构函数中访问 errno 是安全的。

如您所说,跨不同翻译单元的静态存储持续时间对象的初始化顺序无法保证; 一个 TU 中执行初始化定义顺序,然后以相反的顺序进行销毁。

这就是它的全部(除了解决方法,例如将全局变量放在人工类中或从函数返回 static 局部变量)。

您的示例问题的答案取决于调用析构函数的对象的存储持续时间。如果该对象具有静态存储持续时间并且位于不同的翻译单元中,那么您就不走运了。如果它是自动或动态分配的,或者如果它是在全局变量之后的同一个翻译单元中定义的,则没有问题。

关于c++ - 相对于类静态的原始全局变量的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41487900/

相关文章:

c++ - 访问 CV_32SC1 nx1 opencv 矩阵

c++ - Arduino 上有不同的 I2C 地址吗?

针对缓冲区溢出、格式字符串错误和整数溢出的 C++ 安全框架

c++ - 用 C++ 编写可移植动态加载库的最简单方法是什么?

c++ - 如何检查 vector 中是否存在单词

c++ - 嵌套结构的值初始化无法正常工作

c++ - 用另一个 constexpr 数组支撑成员数组的初始化

c++ - 使用 ispunct 的函数断言失败

c++ - 在C++中的模板类中定义方法

c++ - 为什么常数值变化不被视为错误?