【发布时间】:2021-09-06 08:56:44
【问题描述】:
标准对程序退出期间的函数局部静态初始化有什么规定?
编辑:为清楚起见,我的意思是代码示例中的一个案例 - 本地静态 b 在构造另一个静态 a 之后构造(因此应该在 a 之前销毁 b),但是b 也是在a 的析构函数期间构造的,所以应该立即销毁吗?后? UB?
我没有找到任何关于这件事的参考。
我想知道这种情况是 UB,还是应该有一些明确的行为?
下面的代码就是一个例子:
struct B{};
void foo()
{
static B b;
}
struct A
{
~A() { foo(); }
};
int main()
{
static A a;
return 0;
}
如你所见,A的析构函数会在程序退出时发生(因为它有静态存储),它会尝试构造一个B静态实例。
如果 C++17 在这个主题上有什么不同的话,我对它更感兴趣。
【问题讨论】:
-
程序已经为静态变量保留了空间,因为它们基本上是只能在特定范围内访问的全局变量。 AFAIK 这段代码 100% 没问题,应该做你期望它做的事情。
-
从这里的答案来看,行为在 C++11 之前是未指定的,并且从那以后保证以相反的顺序进行破坏。 stackoverflow.com/questions/3143180/…
-
本段 "...如果线程本地或静态对象 A 的构造函数或动态初始化的完成顺序在线程本地或静态对象 B 之前,则完成B 的破坏是有序的——在 A 的破坏开始之前..." 但我们已经在 A 的析构函数中,所以我们自相矛盾 - en.cppreference.com/w/cpp/utility/program/exit
-
标准参考basic.start.term 与上述问题相同
标签: c++ static language-lawyer object-lifetime