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

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

如果觉得这是个问题,并且也想解决这个问题,可以仔细阅读下《C++中的单例模式及按需释放模型》系列博文,会对你解决这个问题有帮助的。
...全文
260 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gogogo 2011-12-01
  • 打赏
  • 举报
回复
4楼,正如你最后一句“这一句的作用是:程序关闭后,会自动调用函数void Singleton::Destroy();“,你是在程序退出的时候释放。

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

#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();
gogogo 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pathuang68 的回复:]

这是一个很好的问题。

很多人都误以为Singleton就一定保持在那里,这其实是不正确的,至少是不完整的。我以前写过一篇文章C++实现Singleton模式可以做到:
1. 多线程安全
2. 按需释放
[/Quote]
浏览了下你的文章,确实有些内容是我以前没有看到的,功能实现上很好,但是我觉得你这里仍然不能说是按需释放,只是安全释放,你用了静态的类成员auto_ptr来管理,别忘了静态类成员变量的析构发生在什么时候,还是程序退出的时候,不能做到程序还在运行,我切换程序模块把其他模块使用的单例释放掉,不知道我说的对不对。
pathuang68 2011-12-01
  • 打赏
  • 举报
回复
这是一个很好的问题。

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

camelisi 2011-12-01
  • 打赏
  • 举报
回复
刚接触模式,学习了,先收藏后看
周晓荣 2011-12-01
  • 打赏
  • 举报
回复
顶一个,挺喜欢LZ的文章。

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧