类CGarbo被定义为CSingleton的私有内嵌类,以防该类被在其他地方滥用。

  程序运行结束时,系统会调用CSingleton的静态成员Garbo的析构函数,该析构函数会删除单例的实例。

  使用这种方法释放单例对象有以下特征:

  在单例类内部定义专有的嵌套类;

  在单例类内定义私有的专门用于释放的静态成员;

  利用程序在结束时析构全局变量的特性,选择终的释放时机;

  使用单例的代码不需要任何操作,不必关心对象的释放。

  进一步的讨论

  但是添加一个类的静态对象,总是让人不太满意,所以有人用如下方法来重现实现单例和解决它相应的问题,代码如下:


class CSingleton
{
    //其他成员
    public:
        static Singleton &GetInstance()
{
    static Singleton instance;
    return instance;
}
        private:
            Singleton() {};
};


  使用局部静态变量,非常强大的方法,完全实现了单例的特性,而且代码量更少,也不用担心单例销毁的问题。

  但使用此种方法也会出现问题,当如下方法使用单例时问题来了,

  Singleton singleton = Singleton :: GetInstance();

  这么做出现了一个类拷贝的问题,这违背了单例的特性。产生这个问题原因在于:编译器会为类生成一个默认的构造函数,来支持类的拷贝。

  后没有办法,我们要禁止类拷贝和类赋值,禁止程序员用这种方式来使用单例,当时领导的意思是GetInstance()函数返回一个指针而不是返回一个引用,函数的代码改为如下:


static Singleton *GetInstance()
{
static  Singleton instance;
return  &instance;
}


  但我总觉的不好,为什么不让编译器不这么干呢。这时我才想起可以显示的生命类拷贝的构造函数,和重载 = 操作符,新的单例类如下:


class Singleton
{
    //其他成员
    public:
        static Singleton &GetInstance()
{
    static Singleton instance;
    return instance;
}
        private:
            Singleton() {};
            Singleton(const Singleton);
            Singleton & operate = (const Singleton&);
};


  关于Singleton(const Singleton); 和 Singleton & operate = (const Singleton&); 函数,需要声明成私用的,并且只声明不实现。这样,如果用上面的方式来使用单例时,不管是在友元类中还是其他的,编译器都是报错。

  不知道这样的单例类是否还会有问题,但在程序中这样子使用已经基本没有问题了。