C++: 单例模式和缺陷

实现一个单例模式

1 class Singleton {
2     private:
3         Singleton() { cout << "Singleton::constructor" << endl; }
4         ~Singlton() { cout << "Singleton::destructor" << endl; }
5         Singleton(const Singleton&) {};
6         Singleton &operator=(const Singleton&) {};
7     public:
8         static Singleton* getInstance() {
9             if(m_aInstance == NULL) {
10                 m_aInstance = new Singleton();
11             }
12             return m_aInstance;
13         }
14         void show() {
15             cout << "Singleton::show" << endl;
16         }
17     private:
18         static Singleton* m_aInstance;
19 };
20  
21 Singleton* Singleton::m_aInstance = NULL;
22  
23 int main(int argc, char **argv) {
24     Singleton* aSingleton = Singleton::getInstance();
25     aSingleton->show();
26     return 0;
27 }
编译执行上面的代码,输出如下:

Singleton::constructor
Singleton::show
我们发现上面的输出并没有调用到Singleton的虚构函数,Singleton的资源可能没有被释放。现在的问题是要怎么才能在程序退出的时候正确释放Singleton的资源。我们注意到这样一个事实:

系统会自动调用在栈和静态数据区上分配的对象的析构函数来释放资源。

修改程序如下:

1 class Singleton {
2     private:
3         Singleton() { cout << "Singleton::constructor" << endl; }
4         ~Singleton() { cout << "Singleton::destructor" << endl; }
5         Singleton(const Singleton&) {};
6         Singleton &operator=(const Singleton&) {};
7     public:
8         static Singleton* getInstance() {
9             if(m_aInstance == NULL) {
10                 m_aInstance = new Singleton();
11             }
12             return m_aInstance;
13         }
14         void show() {
15             cout << "Singleton::show" << endl;
16         }
17  
18     private:
19         class Garbage{
20             public:
21                 ~Garbage() {
22                     if(m_aInstance != NULL) {
23                         delete m_aInstance;
24                     }
25                 }
26         };
27      
28     private:
29         static Singleton* m_aInstance;
30         static Garbage m_garbage;
31 };
32  
33 Singleton* Singleton::m_aInstance = NULL;
34 Singleton::Garbage Singleton::m_garbage;
35  
36 int main(int argc, char **argv) {
37     Singleton* aSingleton = Singleton::getInstance();
38     aSingleton->show();
39     return 0;
40 }
编译上面的代码并执行,输出如下:

Singleton::constructor
Singleton::show
Singleton::destructor

我们看到Singleton::destructor被明确的执行了。

C++: 单例模式和缺陷的更多相关文章

  1. DCL单例模式中的缺陷及单例模式的其他实现

    DCL:Double Check Lock ,意为双重检查锁.在单例模式中懒汉式中可以使用DCL来保证程序执行的效率. 1 public class SingletonDemo { 2 private ...

  2. GJM : C#设计模式(1)——单例模式

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  3. C#设计模式(1)——单例模式

    一.概念:确保一个类只有一个实例,并提供一个全局访问点. 二.单例模式具备如下几个特点: 1.只有一个实例. 2.能够自我实例化. 3.提供全局访问点.  三.代码实现 1.简单实现 /// < ...

  4. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  5. 设计模式(一)单例模式(Singleton Pattern)

    一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了 ...

  6. ios 开发之单例模式

    在iOS开发中,有很多地方都选择使用单例模式.有很多时候必须要创建一个对象,并且不能创建多个,用单例就为了防止创建多个对象.单例模式的意思就是某一个类有且只有一个实例.单例模式确保某一个类只有一个实例 ...

  7. 解决 PhpStorm 对 用单例模式实例化PHP类时,代码自动提示功能失效 的问题

    大部分PHP框架中,为了防止一个类被重复实例化,往往采用“单例模式”实例化类.我们的项目框架是这样做的: 先写好一个基类 /framework/Base.class.php,内容如下: <?ph ...

  8. Java提高篇——单例模式

    介绍 在我们日常的工作中经常需要在应用程序中保持一个唯一的实例,如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就是我们今天要 ...

  9. 《JAVA与模式》之单例模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述单例模式的: 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的 ...

随机推荐

  1. 返回页面,主页面不刷新window.history.go(-1),主页面刷新window.location.go(-1)

    返回上一页,不刷新 window.history.go(-1) 返回上一页,刷新 window.location.go(-1)

  2. 使用Win7+IIS7发布网站或服务步骤

    1.安装IIS服务:控制面板=>程序=>打开或关闭WINDOWS 功能=>Internet 信息服务=>WEB服务管理器全选√ 和万维网服务:应用程序开发功能: 2.打开IIS ...

  3. js cookie使用方法详解

    代码如下 复制代码 <script>function getCookie(c_name){ if (document.cookie.length>0){ //先查询cookie是否为 ...

  4. iOS - 字典(NSDictionary)

    1. 字典类型的常用处理 //---------------不可变字典 //1.字典的创建 NSArray *array1 = [NSArray arrayWithObjects:@"zha ...

  5. C#解析Json格式数据小结

    最近,遇到了一些不同的Json格式的数据,需要做不同处理才能转化为想要得到的结果,这里总结一下. 第一种形式:status中是{}形式,对象 string json = @"{'name': ...

  6. String str 与 String str=new String("") 区别

    1.当使用String str="abc",这种方式时,先去内存的Heap中找是否存在"abc"这个字符串,若存在,则将地址引用.若不存在则创建. 2.当使用S ...

  7. 本地安装discuz

    出处:http://jingyan.baidu.com/article/b87fe19eb57ff252183568d9.html 网站建目前都很简单,建站容易,管理难,网站做大优化更难.本人有建站经 ...

  8. eclipse中英文切换--四种方式

    若转载,请注明出处 http://www.cnblogs.com/last_hunter/p/5627009.html 谢谢! ------------------------------------ ...

  9. ◆◆◆◆◆◆◆◆◆◆◆linux下软件包的管理◆◆◆◆◆◆◆◆◆◆◆◆◆◆

    查看与制定的路径名相匹配的软件包 [root@localhost certs]# which ls alias ls='ls --color=auto' /bin/ls [root@localhost ...

  10. AngularJS(6)-选择框Select

    1.在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和数组循环输出 <!DOCTYPE html> <html lang=" ...