gpt4 book ai didi

c++ - 局部静态对象的销毁

转载 作者:行者123 更新时间:2023-12-03 06:54:45 29 4
gpt4 key购买 nike

考虑这样的情况:

#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();
}

在编译器的实现中,我研究了通过调用 _atexit 设置 S::~S() 的代码中的这些结果,即本地静态对象将停止在 main() 退出后的某个时刻存在。

如果全局静态/外部作用域中的对象的析构函数调用具有函数局部静态作用域的函数会发生什么第一次?这也可能是对象函数局部静态作用域的析构函数在函数局部静态作用域中构造另一个对象的情况。

这可能是一个代码库依赖于 Scott Meyers 的单例实现的多个实例的情况,其中对象实例是函数局部静态变量。我不确定如果这样的单例必须在这个执行阶段访问标准流,保证会发生什么,是否确定它们在 atexit 处理程序后停止运行。

最佳答案

这是一个已知解决方案的已知问题,不幸的是它相当复杂。我知道的最好方法是 Phoenix Singleton来自现代 C++ 设计。简而言之,您可以依赖非类单例的值,并且您可以重用的内存来重新创建一个 S 对象在同一位置。

另一种方法是将一些实用单例替换为由其余单例共同拥有的对象,即通过 shared_ptr。这将在最后一个单例超出范围后被删除。

关于c++ - 局部静态对象的销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64547131/

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