单例模式的构造和析构问题
来源:互联网 发布:java两种时间格式转换 编辑:程序博客网 时间:2024/06/06 01:24
今天再看代码的过程中遇到一个问题,师哥指点后自己算是初步学习了下,现在记录一下我之前的知识盲点:单例模式(GOF23中有介绍)
一个简单的单例模式的实现过程:
一.首先看代码的实现:
class CSingleMode
{
public:
static CSingleMode* Instance()
{
if(m_pMemoryPools == NULL)
{
m_CSingleMode= (CSingleMode* )malloc(sizeof(CSingleMode));
m_CSingleMode->Init();
}
return *m_pMemoryPools;
}
public:
~CSingleMode(void);
private:
CSingleMode(void);
void Close();
void Init();
private:
static CSingleMode* m_CSingleMode;
};二.单例模式的基本构成需要:
1.它有一个指唯一实例的静态指针m_CSingleMode,并且是私有的。
2.它有一个公有的函数,可以获取这个唯一的实例,并在需要的时候创建该实例:本例中就是static CSingleMode* Instance()函数实现了单例的构造和初始化;
3.它的构造函数是私有的,这样就不能从别处创建该类的实例:CSingleMode(void);
三.单例模式的清理:
所谓的单例就是,使用Instance函数之后不会再创建这个类的实例了,因为他是static的,然后就可以通过它的私有变量m_CSingleMode来使用这个类提供的功能和资源了;
那么m_CSingleMode指向的空间什么时候释放呢?更严重的问题是,这个实例的析构操作什么时候执行?
如果在这个构造函数中申请了资源或者打开了文件,网络等的,那么最稳妥的就是在析构的时候关闭这些资源,或者清除申请的资源,这样才能保证程序的正常运行,那么我们可以使用一个私有的函数来完成这个功能了:
void CSingleMode ::Close()
{
if (CSingleMode ::m_CSingleMode)
delete CSingleMode ::m_CSingleMode;
}
~CSingleMode(void)
{
close();
}
这样在程序退出的时候就会自动调用析构函数,然后用close()这个类的私有函数完成清理工作了,这样就可以放心的使用单例提供的资源了。
或者使用一个内嵌的清理类来完成这个功能:
class CSingleMode
{
public:
static CSingleMode* Instance()
{
if(m_pMemoryPools == NULL)
{
m_CSingleMode= (CSingleMode* )malloc(sizeof(CSingleMode));
m_CSingleMode->Init();
}
return *m_pMemoryPools;
}
public:
~CSingleMode(void);
private:
CSingleMode(void);
void Init();
static CSingleMode* m_CSingleMode;
//类Cleanall被定义为CSingleMode的私有内嵌类,以防该类被在其它地方滥用
class Cleanall
{
public:~Cleanall()
{
if (CSingleMode ::m_CSingleMode)
delete CSingleMode ::m_CSingleMode;
}
}
static Cleanall Cleanall;//定义一个静态成员,在程序结束时系统会调用它的析构函数
};
这样的好处在于:
1.在单例类内部定义专有的嵌套类。
2.在单例类内定义私有的专门用于释放的静态成员。
3.利用程序在结束时析构全局变量的特性,选择最终的释放时机。
4.使用C++单例模式的代码不需要任何操作,不必关心对象的释放。
- 单例模式的构造和析构问题
- 简单的单例模式和构造函数
- 构造方法私有化和单例模式
- Kotlin 构造器和单例模式
- 私有构造函数,析构函数,单例模式
- 单例模式的问题
- 懒汉单例构造模式
- 单例模式和Rxjava遇到的问题
- 单例模式和Rxjava遇到的问题
- 单例模式和Rxjava遇到的问题
- 单例模式的三种构造方法
- 单例模式强烈推荐的方式:利用静态构造函数
- 彻底构造一个安全的单例模式
- 有关Js的单例模式、工厂模式、构造函数模式
- 设计模式中的单例模式的代码为什么析构函数会多次被调用,而构造函数只调用一次?
- 单例设计模式的相关问题
- 单例模式---定时器的问题
- Python单例模式的问题
- Struts Action Mapping
- android TextView文字透明度和背景透明度设置
- 统计信息与子分区
- 反卷积效果2
- JNLP 客户端不缓存及jar包的版本号问题
- 单例模式的构造和析构问题
- 使用ActionForward导航
- C/C++实现栈的各种方法代码
- oracle 冷备
- 控件的大小和位置随窗口变化
- ActionForm捕获表单数据
- toad 学习笔记
- centos6.0 配置SVN
- POJ 题目分类