码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2017-10-16 21:46:25      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:开始   pre   静态成员   内存   init   mem   code   ati   实现   

---恢复内容开始---

  单例模式实现方式:将构造函数、拷贝构造函数、赋值构造函数声明为私有的。然后因为不能够创建对象,所以我们必须提供一个接口用于创建一个对象。必须将其声明为static静态成员函数,是指属于类而不属于对象,即整个类只有一份。静态成员函数只能访问静态数据成员,所以数据成员也要声明为静态的。

  

 1 #include<iostream>
 2 using namespace std;
 3 class Singleton
 4 {
 5 public:
 6     static Singleton* Getinstance()
 7     {
 8         //只能构造一个
 9         if (p == NULL)
10             p = new Singleton();
11         return p;
12     }
13     ~Singleton() { cout << "~Singleton" << endl; }//并未调用析构函数
14 private:
15     Singleton() { cout << "Singleton" << endl; };
16     Singleton(const Singleton& other) {};
17     Singleton& operator=(const Singleton& other) {};
18     static Singleton* p;
19 };
20 Singleton* Singleton::p = NULL;
21 int main()
22 {
23     Singleton* s1 = Singleton::Getinstance();
24     Singleton* s2 = Singleton::Getinstance();
25     return 0;
26 }

  上述单例模式的实现存在两个问题,一是它并未调用析构函数,存在内存泄漏;而是它并不是线程安全的。首先解决内存泄漏问题。引入auto_ptr智能指针即可解决。

 1 #include<iostream>
 2 #include<memory>
 3 using namespace std;
 4 class Singleton
 5 {
 6 public:
 7     static Singleton* Getinstance()
 8     {
 9         //p.get()返回原生指针。
10         if (!p.get())
11             p = auto_ptr<Singleton>(new Singleton);
12         return p.get();
13     }
14     ~Singleton() { cout << "~Singleton" << endl; }//并未调用析构函数
15 private:
16     Singleton() { cout << "Singleton" << endl; };
17     Singleton(const Singleton& other) {};
18     Singleton& operator=(const Singleton& other) {};
19     //static Singleton* p;
20     //将裸指针用智能指针来管理
21     static auto_ptr<Singleton> p;//析构函数会被调用
22 };
23 auto_ptr<Singleton> Singleton::p;
24 int main()
25 {
26     Singleton* s1 = Singleton::Getinstance();
27     Singleton* s2 = Singleton::Getinstance();
28     return 0;
29 }

  第二个问题,要解决线程安全问题,可以引入互斥量。在创建单例对象的时候进行加锁。

 1 #include<iostream>
 2 #include<pthread.h>
 3 using namespace std;
 4 class Singleton
 5 {
 6 public:
 7     static Singleton* Getinstance()
 8     {
 9         pthread_mutex_lock(&mutex);
10         if (p == NULL)
11             p = new Singleton();
12         pthread_mutex_unlock(&mutex);
13         return p;
14     }
15     ~Singleton() { cout << "~Singleton" << endl; }//并未调用析构函数
16 private:
17     Singleton() { pthread_mutex_init(&mutex) };
18     Singleton(const Singleton& other) {};
19     Singleton& operator=(const Singleton& other) {};
20     static Singleton* p;
21     static pthread_mutex_t mutex;
22 };
23 Singleton* Singleton::p;
24 pthread_mutex_t Singleton::mutex;
25 int main()
26 {
27     Singleton* s1 = Singleton::Getinstance();
28     Singleton* s2 = Singleton::Getinstance();
29     return 0;
30 }

 

---恢复内容结束---

单例模式

标签:开始   pre   静态成员   内存   init   mem   code   ati   实现   

原文地址:http://www.cnblogs.com/wsw-seu/p/7678247.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!