超出返回引用的单一实例生存期

Singleton lifetime beyond returning reference

本文关键字:单一 实例 生存期 引用 返回      更新时间:2023-10-16

我和一位同事正在讨论如何制作单例,结果证明我们的做法不同。

我的单身人士 :

class Singleton
{
public:
    static Singleton* getInstance() 
    {
        if(!instance) instance = new Singleton();
        return instance;
    }
    ~Singleton()
    {
        if(instance) delete instance;
    }
private:
    Singleton() {}
    static Singleton* instance;
};

他的单身人士:

class Singleton
{
public:
    static Singleton& getInstance() 
    {
        static Singleton instance;
        return instance;
    }
private:
    Singleton() {}
};

当然,这些示例已简化以供阅读。我喜欢他的解决方案,因为它更短,不知何故更优雅,但有些东西让我烦恼......

当他的getInstance()方法返回实例时,我们不是离开了声明它的范围并对其进行了破坏吗?你如何解释它超越return的生命周期?

您需要在C++中查看存储类。任何声明为 static (或 extern( 的对象都具有静态存储,并在程序结束时以与构造相反的顺序销毁。裸静态对象的构造顺序不是确定性的和麻烦的,尤其是在多线程中。函数本地静态对象(又名斯科特·迈耶的单例(OTH 是在第一次调用拥有函数时构造的 ALAP,并且自 C++11 以来在一个神奇的线程安全庄园中(即没有双重构造(。我会在您朋友的类中添加以下声明,以使单例实际上单身:

class Singleton{
    //...
    Singleton(Singleton const&)=delete;
    Singleton(Singleton&&)=delete;
    auto& operator=(Singleton const&)=delete;
    auto& operator=(Singleton &&)=delete;
};