gpt4 book ai didi

c++ - C++11 中的静态局部变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:32 27 4
gpt4 key购买 nike

有什么区别:

class A {
public:
static const A& GetInstance() {
static A a;
return a;
}
};

class B {
public:
static const B* GetInstance() {
static B* b = new B;
return b;
}
};

? A 和 B 之间的 Singleton 的生命周期是否存在差异?对象的内存位置?一般有什么区别吗?

最佳答案

这两种情况下对象的生命周期是不同的。 C++ 保证静态局部对象将以与其构造相反的顺序销毁。在这两种情况下,构造都将在首次调用 GetInstance 时发生。

但是,在第二种情况下,变量b 被分配了一个用new 分配的指针。当 b 从静态存储中移除时,该内存将一直保留到堆最终被拆除。在那个阶段,它将被视为“泄漏”,并且永远不会调用 B 的析构函数(如果有的话)。

像这样实现基于指针的方法会更好:

class B {
public:
static const B* GetInstance() {
static std::unique_ptr<B> b( new B );
return b.get();
}
};

现在,B::~B() 将被调用(如果适用),当 b 被销毁时,内存将被正确删除,生命周期是与您的第一个示例相同。

这就剩下你关于内存位置的问题了。位置会不一样。静态变量通常存储在程序的数据段中,而使用 new 分配的任何内容都将存储在堆中。

关于c++ - C++11 中的静态局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34869649/

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