Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36382
  • 博文数量: 10
  • 博客积分: 246
  • 博客等级: 二等列兵
  • 技术积分: 155
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-02 10:56
文章分类
文章存档

2012年(10)

我的朋友

分类: C/C++

2012-11-05 16:05:58

 Singleton设计模式


我们知道,Singleton设计模式要求一个类class只能有一个实例instance存在,下面用C++来实现:


点击(此处)折叠或打开

  1. #include<iostream> 
  2. #include<string> 
  3. using namespace std; 
  4.   
  5. class Singleton{ 
  6. public: 
  7.     static Singleton* getInstance(){ 
  8.         cout<<"Singleton::getInstance"<<endl; 
  9.         if(!sg){ 
  10.             sg = new Singleton(); //创建实例,但在哪里释放呢? 
  11.         } 
  12.         return sg; 
  13.     } 
  14.   
  15. private: 
  16.     Singleton(){ //构造函数声明为私有函数 
  17.         cout<<"Singleton::Constructor"<<endl; 
  18.     } 
  19.     static Singleton *sg; //私有静态变量 
  20. }; 
  21. //初始化静态变量sg为0,不指向任何对象 
  22. Singleton* Singleton::sg = NULL; 
  23.   
  24. int main(){ 
  25.     Singleton *sg = Singleton::getInstance(); 
  26.   
  27.     return 0; 
  28. }
代码说明:将构造函数声明为私有函数,即我们不能通过构造函数来初始化一个对象,而只能通过getInstance函数来创建一个类的实例,在该函数中,new了一个对象,却没有对应的delete语句,这将引起内存泄漏。

下面采用auto_ptr来解决内存泄漏问题:


点击(此处)折叠或打开

  1. class Singleton{ 
  2. public: 
  3.     static auto_ptr<Singleton> getInstance(){ 
  4.         cout<<"Singleton::getInstance"<<endl; 
  5.         if(!sg.get()){ //判断s所指对象是否为空 
  6.             auto_ptr<Singleton> temp(new Singleton); //创建实例 
  7.             sg = temp; 
  8.         } 
  9.         return sg; 
  10.     } 
  11.   
  12. private: 
  13.     Singleton(){ //构造函数声明为私有函数 
  14.         cout<<"Singleton::Constructor"<<endl; 
  15.     } 
  16.     static auto_ptr<Singleton> sg; //私有静态变量 
  17. }; 
  18. //初始化静态变量sg,此时sg不指向任何对象 
  19. auto_ptr<Singleton> Singleton::sg; 
  20.   
  21. int main(){ 
  22.     auto_ptr<Singleton> s(Singleton::getInstance()); //创建实例s 
  23.   
  24.     return 0; 
  25. }
结果:

点击(此处)折叠或打开

  1. Singleton::getInstance 
  2. Singleton::Constructor


阅读(626) | 评论(0) | 转发(0) |
0

上一篇:查找算法

下一篇:http/1.0与http/1.1的区别

给主人留下些什么吧!~~