#include <iostream>
#include <stdio.h>
using namespace std;
//此版本不能保证线程安全
class Singleton1{
public:
static Singleton1* GetInstance()
{
if (_instance == nullptr)
{
_instance = new Singleton1();
atexit(Destructor);
}
return _instance;
}
private:
static void Destructor()
{
if (_instance != nullptr)
{
delete _instance;
_instance = nullptr;
cout << "清理资源" << endl;
}
}
Singleton1(){cout << "构造函数" << endl;};
~Singleton1(){cout << "析构函数" << endl;}
Singleton1(const Singleton1& other){cout << "拷贝构造函数" << endl;}
Singleton1& operator=(const Singleton1&){cout << "赋值函数" << endl;}
static Singleton1* _instance;
};
Singleton1* Singleton1::_instance = nullptr;
// c++11 magic static 特性:如果当变量在初始化的时候,并发同时进⼊声明语句,并发线程将会阻塞等待初始化结束。
/*该版本具备 所有优点:
1. 利⽤静态局部变量特性,延迟加载;
2. 利⽤静态局部变量特性,系统⾃动回收内存,⾃动调⽤析构函数;
3. 静态局部变量初始化时,没有 new 操作带来的cpu指令reorder操作;
4. c++11 静态局部变量初始化时,具备线程安全;
*/
class Singleton2{
public:
static Singleton2& GetInstance()
{
static Singleton2 singleIns;
return singleIns;
}
private:
Singleton2(){cout << "构造函数" << endl;};
~Singleton2(){cout << "析构函数" << endl;}
Singleton2(const Singleton2& other){cout << "拷贝构造函数" << endl;}
Singleton2& operator=(const Singleton2&){cout << "赋值函数" << endl;}
};
int main()
{
Singleton2 &singleIns1 = Singleton2::GetInstance();
cout << "singleIns1:" << &singleIns1 << endl;
Singleton2 &singleIns2 = Singleton2::GetInstance();
cout << "singleIns2:" << &singleIns2 << endl;
return 0;
}
单例模式--代码
于 2022-01-31 00:17:29 首次发布