1.单例模式
class Singleton {
public:
static Singleton * GetInstance() {
if (_instance == nullptr) {
_instance = new Singleton();
}
return _instance;
}
private:
Singleton(){}; //构造
~Singleton(){};
Singleton(const Singleton &) = delete; //拷⻉
构造
Singleton& operator=(const Singleton&) =
delete;//拷贝赋值构造
Singleton(Singleton &&) = delete;//移动构造
Singleton& operator=(Singleton &&) =
delete;//移动拷贝构造
static Singleton * _instance;
};
Singleton* Singleton::_instance = nullptr;//静态成
员需要初始化
特点:私有的构造和析构,禁用拷贝构造、拷贝赋值、移动构造、移动赋值,问题是导致内存泄露。
方法1:用atexit(delete),程序结束是delete掉,只解决内存泄漏,没有考虑多线程。
方法2:加锁,没有考虑多核cpu下的指令重排,构造函数先分配内存,调用构造函数,最后返回指针。
方法3:无锁编程,使用同步原语:原子变量,内存栅栏fence。
方法4:静态局部对象变量,系统自动回收内存,自动调用析构函数,不用new。