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. Aisen仿新浪微博客户端项目源码

    新浪目前已经限制了第三方微博的很多API接口,加上平常时间不够,所以后续可能不会面向产品的去维护Aisen,不过也有了一些新的方向,例如引入最新Android-support-library,在一个完 ...

  2. C# 微信扫码支付 回调页面

    .NET版 微信扫码支付,官方推荐使用[模式二] 一.微信扫码支付模式一: 1.回调页面:官方demo中example文件下的NativeNotifyPage.aspx 2.微信回调地址:http:/ ...

  3. DOM_节点层次

    一.DOM1级定义了一个Node接口,这个接口是由DOM中的所有节点类型实现的.Node接口共有12种节点类型,常见的是元素节点.文本节点和文档节点. Node.ELEMENT_NODE(1);——元 ...

  4. Java+Mysql+学生管理系统

    最近正在学java和数据库,想起以前写的学生管理系统,都是从网上下载,敷衍了事.闲来无事,也就自己写了一个,不过功能实现的不是很多. 开发语言:java: 开发环境:Mysql, java: 开发工具 ...

  5. 将一个应用程序添加做成windows服务

    需求来源: 在服务器端运行的一个应用程序,为完成客户端路径分析等功能: 此应用程序只需要运行着就可以,没有界面等要求: 因此,考虑把此应用程序添加到服务器端电脑管理的服务中,可以启动和停止. 这里添加 ...

  6. TIMAC 学习笔记(二)

    昨天大体上熟悉了TIMAC自带的CC2530的示范例程,今天先从演示抓包入手,分析四种不同的配置工程在空中传输的差异.随后,会按照扫描.组网.入网等MAC层接口函数入手,结合IEEE 802.15.4 ...

  7. MQ队列

    显示队列名dspmq 打开队列 runmqsc QMSAA 200-远程队列 dis qr(*) 显示所有队列 dis qr(saa_to_cips) all 显示队列参数 20-本地队列 查看队列深 ...

  8. POJ 2528 Mayor’s posters

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37982   Accepted: 11030 ...

  9. Poj OpenJudge 百练 1860 Currency Exchang

    1.Link: http://poj.org/problem?id=1860 http://bailian.openjudge.cn/practice/1860 2.Content: Currency ...

  10. <c:forEach>用法

    <c:forEach items="${xqsCheckDataList}" var="ch"> <c:if test="${ch. ...