1. 思想
1.1 什么是单例模式
单例模式需要保证类只有唯一的实例,而且要满足两个要求:
- 线程安全
- 内存不泄露
1.2 实现方式
有两种方法可以实现,分别是 static 对象(数据存放在data 段)和 new 动态分配(存放在堆区)
- static:静态对象的生命周期由编译器来管理,它直到程序结束时才会释放。而且在 C++11 及以后,static 创建的变量是线程安全的。
- new:需要手动保证线程安全以及内存不泄露
下面给出两大类方法的具体实现:
Singleton1【推荐】:static 局部对象(懒汉)
Singleton2:static 数据成员(饿汉)
Singleton3:new + 双检锁(Double-Checked Locking Pattern)(懒汉)
Singleton4:new + 双检锁+(自定义内部类释放内存)(懒汉)
Singleton5【次之】:new + 双检锁+(智能指针+自定义deleter)(懒汉)
2. 算法代码
2.1 Singleton1
- h
/**
* @brief 使用 static 对象保证唯一单例,懒汉模式(使用到才构造)
* 线程安全,无内存泄漏
* 要求:C++11 及以后标准
*/
class Singleton1{
public:
static Singleton1& getInstance();
public:
// Rule of Three
Singleton1(const Singleton1&) = delete;
Singleton1& operator=(const Singleton1&) = delete;
private:
Singleton1();
~Singleton1();
};
- cpp
Singleton1::Singleton1(){
cout<<"singleton1 create"<<endl;
}
Singleton1::~Singleton1(){
cout<<"singleton1 delete"<<endl;
}
Singleton1& Singleton1::getInstance(){
static Singleton1 instance_;
return instance_;
}
- h
class Singleton2{
public:
static Singleton2& getInstance();
public:
Singleton2(const Singleton2&) = delete;
Singleton2& operator=