单例模式的构造和析构问题

今天再看代码的过程中遇到一个问题,师哥指点后自己算是初步学习了下,现在记录一下我之前的知识盲点:单例模式(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++单例模式的代码不需要任何操作,不必关心对象的释放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值