getInstance - 类与方法静态

时间:2016-03-02 20:08:43

标签: c++ static initialization singleton

我知道有关静态变量何时初始化的基本保证。最重要的是(对我来说)不能保证的是不同编译单元中变量的初始化顺序,这引发了以下问题。

我总是写这样的单身人士课程:

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;
}

但据我所知,这并不保证实例已经初始化(因此调用操作符bool是有效的)如果我在任何其他静态Object的构造函数中调用此函数(在某些罕见的情况下可能会在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;
}

在我看来,这不仅仅是更干净,而且更好的代码,因为现在我有一个保证的初始化顺序。

我的假设是否正确?

1 个答案:

答案 0 :(得分:0)

实际上_instance保证在第一次调用getInstance()之前初始化(假设它们是在同一个翻译单元中定义的)

来自标准 3.6.2-4非本地变量的初始化

  

实现定义是否使用静态存储动态初始化非局部变量   持续时间在主要的第一个陈述之前完成。如果初始化延迟到某个时间点   在第一个main语句之后,它应该在任何函数或变量的第一次使用(3.2)之前发生   在与要初始化的变量相同的翻译单元中定义.35