为了账号安全,请及时绑定邮箱和手机立即绑定

Meyers如何实现Singleton实际上是Singleton

Meyers如何实现Singleton实际上是Singleton

C++
叮当猫咪 2019-10-09 16:08:55
我已经阅读了很多有关Singleton的信息,何时应该使用以及不应该使用它们,以及如何安全地实现它们。我正在用C ++ 11编写,并且遇到了迈耶的单例的懒惰初始化实现。该实现是:static Singleton& instance(){     static Singleton s;     return s;}我从SO上的其他问题中了解到线程安全性如何,但是我不明白的是这实际上是单例模式。我已经用其他语言实现了单例,并且这些总是以类似于Wikipedia的示例的形式结束:public class SingletonDemo {        private static volatile SingletonDemo instance = null;        private SingletonDemo() {       }        public static SingletonDemo getInstance() {                if (instance == null) {                        synchronized (SingletonDemo .class){                                if (instance == null) {                                        instance = new SingletonDemo ();                                }                      }                }                return instance;        }}当我看第二个示例时,这是一个单例非常直观,因为该类持有对自身一个实例的引用,并且仅返回该实例。但是,在第一个示例中,我不明白这如何防止对象存在两个实例。所以我的问题是:第一个实现如何执行单例模式?我认为它与static关键字有关,但我希望有人可以向我深入说明幕后情况。在这两种实现方式之间,是否有一种比另一种更好?优缺点都有什么?谢谢你的帮助,
查看完整描述

2 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

// Singleton.hpp

class Singleton {

public:

    static Singleton& Instance() {

        static Singleton S;

        return S;

    }


private:

    Singleton();

    ~Singleton();

};

此实现称为Meyers'Singleton。斯科特·迈耶斯(Scott Meyers)说:


“这种方法基于C ++的保证,即在调用该函数期间首次遇到对象的定义时,将初始化本地静态对象。” ...“此外,如果您从不调用模拟非本地静态对象的函数,那么就不会招致构造和破坏对象的费用。”


Singleton& s=Singleton::Instance() 首次调用 时,将创建该对象,并在下一次调用Singleton::Instance()结果时返回同一对象。主要问题:


受破坏订单惨败(相当于初始化订单惨败)的限制

另一个实现称为可信任的泄漏Singleton。


class Singleton {

public:

    static Singleton& Instance() {

        if (I == nullptr) { I = new Singleton(); }

        return *I;

    }


private:

    Singleton();

    ~Singleton();


    static Singleton* I;

};


// Singleton.cpp

Singleton* Singleton::I = 0;

两个问题:


泄漏,除非您实施Release并确保调用它(一次)

不是线程安全的


查看完整回答
反对 回复 2019-10-09
  • 2 回答
  • 0 关注
  • 779 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信