单例模式
单例模式:属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)。
如何让类有且仅有一个实例对象?
类对象的实例化是通过构造函数和拷贝构造函数产生的,要想让类对象有且仅有一个实例化对象,构造函数和拷贝构造函数的属性必不可能为public(即private)。
下面这个是最推荐的单例模式--局部静态变量
可能很多基础不太好的看不懂,解释一下就明白了:
1,static修饰类的成员函数,此函数不在为类对象的成员函数而是类的成员函数。
2,static修饰局部变量变为局部静态变量,作用域是函数体内从定义开始到函数结束,但是并没有被销毁(存储在静态存储区),函数再次被调用,仍然可以看到它。
看一下几个有缺陷的单例模式
有缺陷的懒汉式(Lazy-Initialization),方法是直到使用时才实例化对象,也就说直到调用getObject() 方法的时候才 new 一个单例的对象, 如果不被调用就不会占用内存。
从图上可以看出,这种方式造成了内存泄漏(直到程序结束都没能执行析构函数释放申请到的内存),解决内存泄露的办法是在主函数底部添加delete p1,除此之外不要疑惑为啥类的静态成员为啥在类外初始化:
static const int count = 0; //静态成员常量需要在类内初始化。
static int count; //静态变量需要在类外初始化。
懒汉模式改进(线程安全,内存安全的懒汉模式):
看到这,可能有人问,为啥析构函数当到public里面了,原因是用智能指针share_ptr<Singleton>申请了一个对象,必须在程序结束的时候执行析构函数。
总结:最简单安全的方式还是局部静态变量的单例模式,内存和线程安全的懒汉模式看虽然也能达到一样的程度,但是就代码复杂度来说不容易维护。