+ -
当前位置:首页 → 问答吧 → 分享一下C++中的单例模式及按需释放模型

分享一下C++中的单例模式及按需释放模型

时间:2011-12-01

来源:互联网

单例模式是设计模式中最简单最容易理解的模式之一,实用方便,项目设计开发中会被经常使用,但是不知道大家有没有考虑过这个问题,单例模式实例什么时候被释放,大家有兴趣可以仔细分析下,按照目前通常方法实现的单例模式都是直到系统退出的时候才释放的,甚至是有垃圾回收机制的C#上也是这样的,系统切换了功能模块还存在大量的这个模块根本不使用的单例类对象,实际上是很浪费存储空间的,单例类少还好说,如果单例类有几十甚至几百的时候(中大型项目这个数量不算夸张),这种空间占用就不是可以轻易容忍的了。
  
如果觉得这是个问题,并且也想解决这个问题,可以仔细阅读下《C++中的单例模式及按需释放模型》系列博文,会对你解决这个问题有帮助的。

作者: gogogo   发布时间: 2011-12-01

这是一个很好的问题。

很多人都误以为Singleton就一定保持在那里,这其实是不正确的,至少是不完整的。我以前写过一篇文章C++实现Singleton模式可以做到:
1. 多线程安全
2. 按需释放

作者: pathuang68   发布时间: 2011-12-01

引用 1 楼 pathuang68 的回复:

这是一个很好的问题。

很多人都误以为Singleton就一定保持在那里,这其实是不正确的,至少是不完整的。我以前写过一篇文章C++实现Singleton模式可以做到:
1. 多线程安全
2. 按需释放

浏览了下你的文章,确实有些内容是我以前没有看到的,功能实现上很好,但是我觉得你这里仍然不能说是按需释放,只是安全释放,你用了静态的类成员auto_ptr来管理,别忘了静态类成员变量的析构发生在什么时候,还是程序退出的时候,不能做到程序还在运行,我切换程序模块把其他模块使用的单例释放掉,不知道我说的对不对。

作者: gogogo   发布时间: 2011-12-01

该回复于2011-12-01 11:27:49被管理员删除

  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
#4楼 得分:0回复于:2011-12-01 11:35:11
[code=C/C++][/code]
#include <iostream>
using namespace std;

class Singleton
{
public:
// 获取唯一实例方法
static Singleton* Instant();
// 销毁实例的内存
static void Destroy();

private:
Singleton();
Singleton(const Singleton&);
void operator=(Singleton);

private:
static Singleton* m_pInstant;

};

Singleton* Singleton::m_pInstant = NULL;

Singleton::Singleton()
{

}
Singleton* Singleton::Instant()
{
if ( NULL == m_pInstant)
{
m_pInstant = new Singleton();

::atexit(Singleton::Destroy);
}
return m_pInstant;
}
void Singleton::Destroy()
{
if ( NULL != m_pInstant )
{
delete m_pInstant;
}
m_pInstant = NULL;
}

int main(int argc,char**argv)
{

Singleton* pInstant = Singleton::Instant();

return 0;
}


::atexit(Singleton::Destroy);
这一句的作用是:程序关闭后,会自动调用函数void Singleton::Destroy();

作者: xingfeng2510   发布时间: 2011-12-01

4楼,正如你最后一句“这一句的作用是:程序关闭后,会自动调用函数void Singleton::Destroy();“,你是在程序退出的时候释放。

我这里讲的是,程序还在运行,因为切换了功能模块,把本模块不用的单例类(其他功能模块使用的)能及时释放掉,从内存中清除出去,如果单例类很多,不用都占着内存是不理想的,我的文章主要是解决这个问题的,请看清楚

作者: tqy2011   发布时间: 2011-12-01

顶一个,挺喜欢LZ的文章。

作者: gogogo   发布时间: 2011-12-01

刚接触模式,学习了,先收藏后看

作者: et214721856   发布时间: 2011-12-01