局部静态对象的销毁
Destruction of local static objects
考虑这样的情况:
#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
的代码中研究了这些结果,即局部静态对象在 [=退出后的某个时刻不再存在=13=].
如果全局 static/extern 作用域中对象的析构函数调用具有函数局部静态作用域的函数会发生什么析构函数是第一次吗?这也可能是对象函数局部静态作用域的析构函数在函数局部静态作用域中构造另一个对象的情况。
这可能是代码库依赖于 Scott Meyers 的单例实现的多个实例的情况,其中对象实例是函数局部静态变量。我不确定如果这样的单例必须在这个执行阶段访问标准流,保证会发生什么,是否确定它们在 atexit
处理程序之后停止运行。
这是一个已知解决方案的已知问题,不幸的是它相当复杂。我知道的最好方法是现代 C++ 设计中的 Phoenix Singleton。简而言之,你可以依赖non-class单例的值,你可以重用s
的内存来在同一位置重新创建一个 S
对象。
另一种方法是将一些实用单例替换为由其余单例共同拥有的对象,即通过 shared_ptr
。这将在最后一个单例超出范围后被删除。
考虑这样的情况:
#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
的代码中研究了这些结果,即局部静态对象在 [=退出后的某个时刻不再存在=13=].
如果全局 static/extern 作用域中对象的析构函数调用具有函数局部静态作用域的函数会发生什么析构函数是第一次吗?这也可能是对象函数局部静态作用域的析构函数在函数局部静态作用域中构造另一个对象的情况。
这可能是代码库依赖于 Scott Meyers 的单例实现的多个实例的情况,其中对象实例是函数局部静态变量。我不确定如果这样的单例必须在这个执行阶段访问标准流,保证会发生什么,是否确定它们在 atexit
处理程序之后停止运行。
这是一个已知解决方案的已知问题,不幸的是它相当复杂。我知道的最好方法是现代 C++ 设计中的 Phoenix Singleton。简而言之,你可以依赖non-class单例的值,你可以重用s
的内存来在同一位置重新创建一个 S
对象。
另一种方法是将一些实用单例替换为由其余单例共同拥有的对象,即通过 shared_ptr
。这将在最后一个单例超出范围后被删除。