`
Riddick
  • 浏览: 644197 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

C++中单例模式对象的释放控制分析

阅读更多

单例模式也称为单件模式、单子模式。使用单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出等。
   单例模式有许多种实现方法,在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函数。

   一个妥善的方法是让这个类自己知道在合适的时候把自己删除。或者说把删除自己的操作挂在系统中的某个合适的点上,使其在恰当的时候自动被执行。

   我们知道,程序在结束的时候,系统会自动析构所有的全局变量。事实上,系统也会析构所有的类的静态成员变量,就像这些静态成员也是全局变量一样。利用这个特征,我们可以在单例类中定义一个这样的静态成员变量,而它的唯一工作就是在析构函数中删除单例类的实例。如下面的代码中的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的析构函数,该析构函数会删除单例的唯一实例。

   使用这种方法释放单例对象有以下特征:

   ·在单例类内部定义专有的嵌套类。

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

   ·利用程序在结束时析构全局变量的特性,选择最终的释放时机。

   ·使用单例的代码不需要任何操作,不必关心对象的释放。
本篇文章来源于:开发学院 http://edu.codepub.com   原文链接:http://edu.codepub.com/2009/0930/15964.php

分享到:
评论

相关推荐

    c++中单例模式对象的释放控制

    然而,在C++中实现单例模式时,如何正确管理这个唯一实例的生命周期,尤其是其释放控制,是一个值得深入探讨的问题。 ### 单例模式中的对象释放控制 #### 1. 理解单例模式 单例模式的主要目的是限制一个类的实例...

    Java多线程编程环境中单例模式的实现

    ### Java多线程编程环境中单例模式的实现 #### 概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式的应用非常广泛,特别是在资源管理、日志记录、...

    基于php设计模式中单例模式的应用分析

    单例模式是软件设计模式中的一种,它的核心思想是确保某个类在整个应用程序中只有一个实例存在。在PHP中,单例模式常用于管理共享资源,如数据库连接或全局配置,以优化性能并提供统一的访问入口。 单例模式的实现...

    JAVA中单例模式的几种实现方式.doc

    ### JAVA中单例模式的几种实现方式 #### 1. 线程非安全的基本实现方式 单例模式是设计模式中的一种常用形式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式可以通过多种方式来...

    Go语言中单例模式的不同线程安全实现及其应用场景

    基于 sync.Once 实现的一次性初始化机制(懒汉模式),双检查锁机制(Double-checked Locking,DCL)下对共享资源的操作减少加锁频率从而提高效率的技术手段,还有借助原子指令完成的对象实例化策略,保证多个 ...

    java 中单例模式饿汉式与懒汉式的对比

    java 中单例模式饿汉式与懒汉式的对比 java 中单例模式是保证一个类仅有一个实例,并提供一个访问它的全局访问点的设计模式。单例模式有以下特点:单例类只能有一个实例,单例类必须自己自己创建自己的唯一实例,...

    Kotlin中单例模式和Java的对比浅析

    Kotlin 中单例模式和 Java 的对比浅析 Kotlin 中单例模式是指在应用程序中确保某个类仅有一个实例,并提供一个全局访问点的机制。单例模式是一种常用的设计模式,在 Java 和 Kotlin 中都有多种实现方式。下面我们将...

    浅谈Java中单例设计模式之构造方法私有化.pdf

    总的来说,单例设计模式是Java中一种非常有用的模式,通过构造方法私有化和其他技术手段,可以有效地控制对象的创建,实现对类实例的唯一性管理,防止对象的滥用,从而提高程序的性能和效率。在设计具体的应用程序时...

    单例模式实现mdi界面子窗体控制

    昨天在论坛看到有人提出MDI界面中控制子窗体不要重复显示的问题 这立刻让我想到了最常用也是最简单最容易理解的一个设计模式 单例模式 何为 单例模式 ? 故名思议 即 让 类 永远都只能有一个实例。 由于 示例...

    C++ 中的单例模式(普通,2B,文艺)

    单例模式常用于管理共享资源,如数据库连接、配置对象等。本篇文章将详细介绍C++中三种常见的单例模式实现:普通、2B(也称为智能)和文艺。 ### 1. 普通单例模式 普通单例模式,也被称为懒汉式单例,它的特点是...

    java单例模式实例

    单例模式是软件设计模式中的一种经典模式,用于确保一个类只有一个实例,并提供一个全局访问点。在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们...

    Python中单例模式总结

    这种模式在需要频繁实例化然后销毁的对象,或者创建对象需要消耗大量资源的场景下非常有用,因为它避免了多次实例化带来的开销。 一、单例模式的四种实现方法: 1. 类方法实现: 在Python中,可以定义一个类方法...

    C++中的单例模式(调用 实例化)

    这是C++中单例魔术的一个程序!适合初学者看看!

    Java中单例模式详解

    单例模式是软件设计模式中的一种,其核心思想...综上所述,Java中的单例模式是一种重要的设计模式,适用于需要控制实例数量和全局访问的场景。根据实际需求,可以选择不同的实现方式,以达到线程安全和性能的最佳平衡。

    Android中单例模式的一些坑小结

    本篇文章将详细探讨Android中单例模式的坑以及如何避免它们。 首先,让我们分析非线程安全的单例模式。以下是一个简单的非线程安全单例类: ```java class Singleton { private static Singleton singleton; ...

    android SQLite DBHelper 单例模式 实现

    android SQLite DBHelper 单例模式 实现 dbhelper=DBHelper.getInstance(this);

    PHP中单例模式与工厂模式详解

    工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当客户端请求创建一个产品对象时,工厂类会负责创建这个对象,而客户端只需关心产品的接口,无需知道具体的产品实现细节。 在PHP中...

Global site tag (gtag.js) - Google Analytics