the*_*oyn 15 c++ static object-lifetime language-lawyer
标准对程序退出期间的函数局部静态初始化有什么看法?
编辑:为了清楚起见,我的意思是代码示例中的情况 - 本地静态b
是在构造另一个静态之后a
构造的(因此应该b
在之前销毁a
),但b
也在a
的析构函数期间构造,所以它应该立即销毁吗?后?优?
我没有设法找到有关此事的任何参考资料。
我想知道这种情况是 UB,还是应该有一些定义的行为?
下面的代码就是一个例子:
struct B{};
void foo()
{
static B b;
}
struct A
{
~A() { foo(); }
};
int main()
{
static A a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,A 的析构函数会在程序退出时发生(因为它具有静态存储),并且它会尝试构造 B 静态实例。
我对 C++17 更感兴趣,如果它在这个主题上有什么不同的话。
Sau*_*rai -2
由于对象 B 是由 A 的析构函数创建的,因此它会在程序退出之前被销毁。我在代码中添加了 print 语句,使其看起来像这样:
#include <iostream>
struct B
{
~B()
{
std::cout << "Called B's Destructor...!";
}
};
void foo()
{
static B b;
}
struct A
{
~A() {
foo();
std::cout << "Called A's Destructor...!\n";
}
};
int main()
{
static A a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它打印以下内容:
Called A's Destructor...!
Called B's Destructor...!
Run Code Online (Sandbox Code Playgroud)
最重要的是,静态变量将在程序结束时(本地或全局)按照创建的顺序被销毁。