C ++单例设计模式

最近我遇到了C ++的Singleton设计模式的实现/实现。 它看起来像这样(我从现实生活的例子中采纳了它):

// a lot of methods are omitted here
class Singleton
{
   public:
       static Singleton* getInstance( );
       ~Singleton( );
   private:
       Singleton( );
       static Singleton* instance;
};

从这个声明中,我可以推断实例字段是在堆上启动的。 这意味着有一个内存分配。 对于我来说完全不清楚的是,何时完全释放内存? 还是有一个错误和内存泄漏? 看起来实施中存在问题。

我的主要问题是,我如何以正确的方式实施它?


看到这篇文章的一个简单的设计,以保证破坏单例的延迟评估:
任何人都可以在c ++中为我提供一个Singleton样本吗?

经典的懒惰评估和正确摧毁单身人士。

class S
{
    public:
        static S& getInstance()
        {
            static S    instance; // Guaranteed to be destroyed.
                                  // Instantiated on first use.
            return instance;
        }
    private:
        S() {}                    // Constructor? (the {} brackets) are needed here.

        // C++ 03
        // ========
        // Don't forget to declare these two. You want to make sure they
        // are unacceptable otherwise you may accidentally get copies of
        // your singleton appearing.
        S(S const&);              // Don't Implement
        void operator=(S const&); // Don't implement

        // C++ 11
        // =======
        // We can use the better technique of deleting the methods
        // we don't want.
    public:
        S(S const&)               = delete;
        void operator=(S const&)  = delete;

        // Note: Scott Meyers mentions in his Effective Modern
        //       C++ book, that deleted functions should generally
        //       be public as it results in better error messages
        //       due to the compilers behavior to check accessibility
        //       before deleted status
};

看到这篇文章关于何时使用单身人士:(不经常)
辛格尔顿:应该如何使用它

看到这两篇关于初始化顺序和如何应对的文章:
静态变量初始化顺序
查找C ++静态初始化顺序问题

请参阅描述生命时间的文章:
什么是C ++函数中静态变量的生命周期?

请参阅本文讨论对单例的一些线程影响:
Singleton实例声明为GetInstance方法的静态变量

请参阅本文解释为什么双重检查锁定在C ++上不起作用:
C ++程序员应该知道的所有常见的未定义行为是什么?
Dobbs博士:C ++和双重检查锁定的危险:第一部分


作为一个单身人士,你通常不希望它被破坏。

当程序终止时,它将被拆除并释放,这对单身人士而言是正常的,理想的行为。 如果你想能够明确地清除它,向类中添加一个静态方法是相当容易的,它允许你将它恢复到干净状态,并在下次使用它时重新分配,但这超出了范围“经典”单身。


你可以避免内存分配。 有多种变体,在多线程环境下都有问题。

我更喜欢这种实现方式(实际上,我不太喜欢这样说,因为我尽可能避免单身人士):

class Singleton
{
private:
   Singleton();

public:
   static Singleton& instance()
   {
      static Singleton INSTANCE;
      return INSTANCE;
   }
};

它没有动态内存分配。

链接地址: http://www.djcxy.com/p/50079.html

上一篇: C++ Singleton design pattern

下一篇: Making a Scrollviewer fill the available space in a DockPanel