gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:35:06 25 4
gpt4 key购买 nike

问题来 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com