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的析构函数,该析构函数会删除单例的独一实例。
利用这种要领释放单例工具有以下特征:
·在单例类内部界说专有的嵌套类。
·在单例类内界说私有的专门用于释放的静态成员。
·操作措施在竣事时析构全局变量的特性,选择最终的释放机缘。
·利用单例的代码不需要任何操纵,不必体贴工具的释放。