C++中单例模式工具的释放节制阐明
当前位置:以往代写 > C/C++ 教程 >C++中单例模式工具的释放节制阐明
2019-06-13

C++中单例模式工具的释放节制阐明

C++中单例模式工具的释放节制阐明

副标题#e#

单例模式也称为单件模式、票据模式。利用单例模式,担保一个类仅有一个实例,并提供一个会见它的全局会见点,该实例被所有措施模块共享。有许多处所需要这样的成果模块,如系统的日志输出等。

单例模式有很多种实现要领,在C++中,甚至可以直接用一个全局变量做到这一点,但这样的代码显得很不优雅。《设计模式》一书中给出了一种很不错的实现,界说一个单例类,利用类的私有静态指针变量指向类的独一实例,并用一个公有静态要领获取该实例。如下面的类界说:

class CSingleton:

  {

   // 其它成员

  public:

   static CSingleton * GetInstance()

   {

   if (m_pInstance == NULL)

   m_pInstance = new CSingleton();

   return m_pInstance;

   }

  private:

   CSingleton(){};

   static CSingleton * m_pInstance;

单例类CSingleton有以下特征:

·它有一个指独一实例的静态指针m_pInstance,而且是私有的。

·它有一个公有的函数,可以获取这个独一的实例,并在需要的时候建设该实例。

·它的结构函数是私有的,这样就不能从别处建设该类的实例。

大多时候,这样的实现都不会呈现问题。有履历的读者大概会问,m_pInstance指向的空间什么时候释放呢?更严重的问题是,这个实例的析构操纵什么时候执行?

假如在类的析构行为中有必需的操纵,好比封锁文件,释放外部资源,那么上面所示的代码无法实现这个要求。我们需要一种要领,正常地删除该实例。

可以在措施竣事时挪用GetInstance并对返回的指针挪用delete操纵。这样做可以实现成果,可是不只很丑恶,并且容易堕落。因为这样的附加代码很容易被健忘,并且也很难担保在delete之后,没有代码再挪用GetInstance函数。

一个妥善的要领是让这个类本身知道在符合的时候把本身删除。可能说把删除本身的操纵挂在系统中的某个符合的点上,使其在得当的时候自动被执行。


#p#副标题#e#

我们知道,措施在竣事的时候,系统会自动析构所有的全局变量。事实上,系统也会析构所有的类的静态成员变量,就像这些静态成员也是全局变量一样。操作这个特征,我们可以在单例类中界说一个这样的静态成员变量,而它的独一事情就是在析构函数中删除单例类的实例。如下面的代码中的CGarbo类(Garbo意为垃圾工人):

class CSingleton:

  {

   // 其它成员

  public:

   static CSingleton * GetInstance(){。。。}

  private:

   CSingleton(){};

   static CSingleton * m_pInstance;

   class CGarbo // 它的独一事情就是在析构函数中删除CSingleton的实例

   {

   public:

   ~CGarbo()

   {

   if (CSingleton::m_pInstance)

   delete CSingleton::m_pInstance;

   }

   };

   static CGarbo Garbo; // 界说一个静态成员,在措施竣事时,系统会挪用它的析构函数

  }

类CGarbo被界说为CSingleton的私有内嵌类,以防该类被在其它处所滥用。

在措施运行竣事时,系统会挪用CSingleton的静态成员Garbo的析构函数,该析构函数会删除单例的独一实例。

利用这种要领释放单例工具有以下特征:

·在单例类内部界说专有的嵌套类。

·在单例类内界说私有的专门用于释放的静态成员。

·操作措施在竣事时析构全局变量的特性,选择最终的释放机缘。

·利用单例的代码不需要任何操纵,不必体贴工具的释放。

    关键字:

在线提交作业