考虑这样一种情况:
#include <iostream>
int foo() {
static struct S {
int value;
S(int a): value(a) {}~S() {
std::cout << "End is nigh";
}
}
s(42);
return s.value;
}
int main() {
return foo();
}
在编译器的实现中,我调查了设置
S::~S()
与_atexit
调用的代码,即在main()
退出后某个时间点上,局部静态对象将停止存在。如果全局静态/外部范围内的对象的析构函数调用一个具有函数局部静态范围的函数,根据定义,该函数局部静态范围在第一次执行进入该范围时会被构造,并且来自析构函数的调用是第一次吗?这也可能是一个在函数局部静态范围内构造另一个对象的析构函数的情况。
这可能是一个依赖于Scott Meyers的单例模式的多个实例的代码库,其中对象实例是一个函数局部静态变量的情况。如果这样的单例必须在执行此阶段时访问标准流,我不确定是否已经确定它们在
atexit
处理程序之后停止工作。
main()
返回后才开始?有多少这样的情况会有替代实现或设计选择,在其中该对象的部分生命周期(例如其构造)发生在main()
返回之前?无论如何,标准 I/O 流(cout
等)都保证可以在静态对象的构造函数和析构函数中访问。 - Peter