关于C++中Singleton类实例析构的讨论zz_第1页
关于C++中Singleton类实例析构的讨论zz_第2页
关于C++中Singleton类实例析构的讨论zz_第3页
关于C++中Singleton类实例析构的讨论zz_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 关于C+中Singleton类实例析构的讨论zz单例模式也称为单件模式、单模式,可能是使最泛的设计模式。其意图是保证个类仅有个实例,并提供个访问它的全局访问点,该实例被所有程序模块共享。有很多地需要这样的功能模块,如系统的志输出,GUI应必须是单标,MODEM的联接需要条且只需要条电话线,操作系统只能有个窗管理器,台PC连个键盘。单例模式有许多种实现法,在C+中,甚可以直接个全局变量做到这点,但这样的代码显的很不优雅。 使全局对象能够保证便地访问实例,但是不能保证只声明个对象也就是说除了个全局实例外,仍然能创建相同类的本地实例。设计模式书中给出了种很不错的实现,定义个单例类,使类的私有静态指

2、针变量指向类的唯实例,并个公有的静态法获取该实例。单例模式通过类本来管理其唯实例,这种特性提供了解决问题的法。唯的实例是类的个普通对象,但设计这个类时,让它只能创建个实例并提供对此实例的全局访问。唯实例类Singleton在静态成员函数中隐藏创建实例的操作。习惯上把这个成员函数叫做Instance(),它的返回值是唯实例的指针。定义如下:class CSingleton/其他成员public:static CSingleton* GetInstance()if ( m_pInstance = NULL ) /判断是否第次调m_pInstance = new CSingleton();retur

3、n m_pInstance;private:CSingleton();static CSingleton * m_pInstance;户访问唯实例的法只有GetInstance()成员函数。如果不通过这个函数,任何创建实例的尝试都将失败,因为类的构造函数是私有的。GetInstance()使懒惰初始化,也就是说它的返回值是当这个函数次被访问时被创建的。这是种防弹设计所有GetInstance()之后的调都返回相同实例的指针:CSingleton* p1 = CSingleton : GetInstance();CSingleton* p2 = p1-GetInstance();CSinglet

4、on & ref = * CSingleton : GetInstance();对GetInstance稍加修改,这个设计模板便可以适于可变多实例情况,如个类允许最多五个实例。单例类CSingleton有以下特征: 它有个指向唯实例的静态指针m_pInstance,并且是私有的;它有个公有的函数,可以获取这个唯的实例,并且在需要的时候创建该实例;它的构造函数是私有的,这样就不能从别处创建该类的实例。多数时候,这样的实现都不会出现问题。有经验的读者可能会问,m_pInstance指向的空间什么时候释放呢?更严重的问题是,该实例的析构函数什么时候执?如果在类的析构为中有必须的操作,如关闭件,释放外

5、部资源,那么上的代码法实现这个要求。我们需要种法,正常的删除该实例。可以在程序结束时调GetInstance(),并对返回的指针掉delete操作。这样做可以实现功能,但不仅很丑陋,且容易出错。因为这样的附加代码很容易被忘记,且也很难保证在delete之后,没有代码再调GetInstance函数。个妥善的法是让这个类知道在合适的时候把删除,或者说把删除的操作挂在操作系统中的某个合适的点上,使其在恰当的时候被动执。我们知道,程序在结束的时候,系统会动析构所有的全局变量。事实上,系统也会析构所有的类的静态成员变量,就像这些静态成员也是全局变量样。利这个特征,我们可以在单例类中定义个这样的静态成员变

6、量,它的唯作就是在析构函数中删除单例类的实例。如下的代码中的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 CGabor Garbo; /定

7、义个静态成员,程序结束时,系统会动调它的析构函数;类CGarbo被定义为CSingleton的私有内嵌类,以防该类被在其他地滥。程序运结束时,系统会调CSingleton的静态成员Garbo的析构函数,该析构函数会删除单例的唯实例。使这种法释放单例对象有以下特征: 在单例类内部定义专有的嵌套类;在单例类内定义私有的专门于释放的静态成员;利程序在结束时析构全局变量的特性,选择最终的释放时机;使单例的代码不需要任何操作,不必关对象的释放。进步的讨论但是添加个类的静态对象,总是让不太满意,所以有如下法来重现实现单例和解决它相应的问题,代码如下:class CSingleton/其他成员public:

8、static Singleton &GetInstance()static Singleton instance;return instance;private:Singleton() ;使局部静态变量,常强的法,完全实现了单例的特性,且代码量更少,也不担单例销毁的问题。但使此种法也会出现问题,当如下法使单例时问题来了,Singleton singleton = Singleton : GetInstance();这么做就出现了个类拷贝的问题,这就违背了单例的特性。产这个问题原因在于:编译器会为类成个默认的构造函数,来持类的拷贝。最后没有办法,我们要禁类拷贝和类赋值,禁程序员这种式来使单例,当

9、时领导的意思是GetInstance()函数返回个指针不是返回个引,函数的代码改为如下:static Singleton *GetInstance()static Singleton instance;return &instance;但我总觉的不好,为什么不让编译器不这么呢。这时我才想起可以显的命类拷贝的构造函数,和重载 = 操作符,新的单例类如下:class Singleton/其他成员 public:static Singleton &GetInstance()static Singleton instance;return instance;private:Singleton() ;S

10、ingleton(const Singleton);Singleton & operate = (const Singleton&);关于Singleton(const Singleton); 和 Singleton & operate = (const Singleton&); 函数,需要声明成私的,并且只声明不实现。这样,如果上的式来使单例时,不管是在友元类中还是其他的,编译器都是报错。不知道这样的单例类是否还会有问题,但在程序中这样使已经基本没有问题了。优化Singleton类,使之适于单线程应Singleton使操作符new为唯实例分配存储空间。因为new操作符是线程安全的,在多线程应中你可以使此设计模板,但是有个缺陷:就是在应程序终之前必须delete摧毁实例。否则,不仅导致内存溢出,还要造成不可预测的为,因为Singleton的析构函数将根本不会被调。通过使本地静态实例代替动态实例,单线程应可以很容易避免这个问题。下是与上的GetInstance()稍有不同的实现,这个实现专门于单线程应:CSingleton* CSingleton :

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论