【发布时间】:2016-03-02 20:08:43
【问题描述】:
我知道关于何时初始化静态变量只有真正的基本保证。最重要的(对我而言)不能保证的是不同编译单元中变量的初始化顺序,这引发了以下问题。
我总是这样写我的单例类:
class A {
...
public:
static std::shared_ptr<A> getInstance();
private:
static std::shared_ptr<A> _instance;
}
== A.cpp ==
std::shared_ptr<A> A::getInstance() {
if(!_instance)
_instance = std::make_shared<A>();
return _instance;
}
但是据我了解,如果我在任何其他静态对象的构造函数中调用此函数(在极少数情况下可能发生在 main开始执行)。
我的新想法如下:
class A {
...
public:
static std::shared_ptr<A> getInstance();
}
== A.cpp ==
A& A::getInstance() {
static std::shared_ptr<A> _instance = std::make_shared<A>();
return _instance;
}
在我看来,这不仅更干净而且代码更好,因为现在我有一个保证的初始化顺序。
我的假设正确吗?
【问题讨论】:
-
既然知道
_instance在第一次调用getInstance的时候肯定会被初始化,那为什么还需要if语句呢? -
因为 _instance 没有值。默认初始化 std::shared_ptr 在其中存储一个空指针。
-
如果是这样,为什么不立即用
new A初始化shared_ptr? -
是的,你是对的,用新的 A 初始化它就可以了。我没有考虑到这一点。但还有一个更好的方法:使用 std::make_shared 进行初始化,它提供了更短的代码和 make_shared 的所有优点。我改变了我的例子。
-
你是对的!我绝对不知道
make_shared比简单地使用new构建更有效。谢谢!
标签: c++ static initialization singleton