#include <iostream>
#include <mutex>
using namespace std;
//内嵌类用来析构static单例
//内嵌类可以访问私有函数,所以可以被嵌套类中私有析构函数
//测试
#define Lazyman2
#ifdef Lazyman1
/**********懒汉模式**********/
//线程不安全,双判断锁,外层判断的作用是节省每次调用都上锁的开销
/*懒汉1:静态成员指针实现*/
class singleton{
private:
singleton(){};
~singleton(){};
singleton(const singleton& a);
singleton& operator=(const singleton& a);
class Garbage{
public:
~Garbage(){
if (singleton::sig != nullptr){
cout << "完成析构" << endl;
delete singleton::sig;
}
}
};
public:
static singleton* sig;
static mutex mut;
static Garbage garbage;
static singleton* getinstance(){
if (sig == nullptr){
mut.lock();
if (sig == nullptr)
sig = new singleton();
mut.unlock();
}
return sig;
}
};
std::mutex singleton::mut;
singleton* singleton::sig = nullptr;
singleton::Garbage singleton::garbage;
#endif // Lazyman
#ifdef Lazyman2
/*懒汉2:静态成员变量*/
class singleton{
private:
singleton(){};
~singleton(){};
singleton(const singleton& a);
singleton& operator=(const singleton& a);
public:
static singleton& getinstance(){
static singleton sig;
return sig;
}
这里可以使用shared_ptr解决释放问题
static shared_ptr<singleton>& getinstance() {/*加不加引用都可以,加引用就是返回指针管理器的引用
static shared_ptr<singleton> p(new singleton);
return p;
}
//可以返回指针
//static singleton* getinstance(){
// static singleton sig;
// return &sig;
//}
};
#endif
/**********饿汉模式**********/
#ifdef Hungryman1
/*饿汉1:静态成员指针实现*/
class singleton{
private:
singleton(){};
~singleton(){};
singleton(const singleton& a);
singleton& operator= (singleton& a);
class Garbage{
public:
~Garbage(){
if (singleton::sig != nullptr){
cout<<"完成析构"<<endl;
delete singleton::sig;
}
}
};
public:
static singleton* sig;
static Garbage garbage;
static singleton* getinstance(){
return sig;
}
};
singleton::Garbage singleton::garbage;
singleton* singleton::sig = new singleton();
#endif
#ifdef Hungryman2
/*饿汉2:静态成员变量*/
class singleton{
private:
singleton(){};
~singleton(){};
singleton(const singleton& a);
singleton& operator= (singleton& a);
public:
static singleton sig;
static singleton& getinstance(){
return sig;
}
//可以返回指针
//static singleton* getinstance(){
// return &sig;
//}
};
singleton singleton::sig;
#endif