单例模式的分类
饿汉模式
在全局区创建单例对象,程序编译时这个单例就已经存在
饿汉模式是线程安全的
懒汉模式
在程序第一次需要使用实例的时候才创建这个单例
懒汉模式并非现场安全
看如下一段代码:
这段代码中,多个线程可能同时检测到s_Instance == nullptr条件为真,从而创建多个实例
同时这段代码使用了双检锁的技术,避免多个线程都要获取锁而带来的性能开销
懒汉模式代码实现
用智能指针+双检锁优化
有一个悬而未决的问题:下面这段代码不能将析构函数设为私有,否则会报错
用智能指针+static局部变量优化
static局部变量保证了线程安全
避免使用锁而带来的开销
使用std::call_once优化
避免使用锁而带来的开销
用单例类中嵌套的垃圾回收类来释放内存
这种方法相比上面的方法可以隐蔽析构函数接口,同时要注意垃圾回收时一定要创建对象而不是指针!
请注意必须要有类外初始化的代码
ShoppingManager::GarbageCollection ShoppingManager::GCobject;
否则甚至编译器都不会创建这个对象,那么这个对象的析构函数也不会执行,也就没有垃圾回收!