一些小问题和单例模式:饿汉模式和懒汉模式

发布时间 2023-05-20 23:27:55作者: 玄灵镜

智能指针的使用是一种思想,他利用类去管理系统的资源,在一些地方很巧妙的处理了编码不好处理的地方。

如下图:

 如果是这样一种情况,这个throw抛异常了,此时跳出到catch的地方,处理完程序后再次使用fun函数此时被锁住了,坏了。所以可以用一个类去管理这个锁,使其除了生命周期后自动析构解锁,这个类的构造函数自动上锁,析构函数自己解锁。如下图所示:

 

以上费了这么大功夫就是为了处理内存泄露的问题,内存泄露的危害很大。

他会让可用内存越来越小,机器越来越慢,这在服务器上是致命的。一次泄露很多没事,很快就能找到,就怕一次泄露一点点,最后崩掉了。

所以不好处理的地方尽量去用智能指针,如果怀疑内存泄漏可以用专用工具去检测。

特殊类的设计:

一般要求的特殊类比如:设计一个类不可以被继承,这个类只能在堆上或者是栈上,

对于不可以被继承:

此时就可以私有化构造函数,使其不可以被继承,因为派生类的初始化必须先初始化基类,然而基类的构造函数私有化了。就不可以继承了或者直接用delete关键字修饰基类的构造函数。

只能在堆上:

定义一个类,将这个类的默认构造函数私有,然后给一个函数接口,返回这个类的堆上的指针,如图:因为只能定义在堆上所以开始没有实例化对象,只能用类名去调用静态函数来构造一个类的指针,

 栈上也一样,将默认构造函数私有禁用,然后留一个返回实例化对象的接口,

也可以用类operator new然后禁用他使其只能在栈上构造。

设计模式:一个反复被大家使用的代码编造方式,比如迭代器,适配器这样的。

单例模式;全局只能有一个的的类:

思路:首先将这个类的构造函数私有化,然后成员变量是这个类的指针并且是一个静态变量,实现一个静态接口返回这个类的指针,并在实现的过程中加一个判断如果成员变量为空则实例化一个对象,如果不为空,返回这个静态变量,因为静态变量是共用的,所以都可以访问到。这样无论调用几次这个构建函数,如果静态区有东西就返回静态区的东西并不会在构造第二个。

这是针对于一个线程的情况,如果两个线程同时实例化这个对象,就会引发线程安全问题。在首次可能会多实例化几个对象。

这时就需要上锁了,然后因为只有第一次开始时引发线程安全问题,所以只有在类的指针为空时进行上锁:如图:

 这里就用了类似于智能指针的unique_mutex.控制锁的生命周期。

上面是懒汉模式;在需要用的时候去初始化对象。

还有一种是饿汉模式:他在main函数之前初始化对象,这避免了线程安全问题。

对比懒汉模式饿汉模式的类成员变量不是指针是类本身,因为静态变量在main函数之前初始化,所以类的是类对象在这之前就初始化好了,main线程进去不用构造第一个对象直接就可以用,所以不会引发线程安全问题。

但是一般项目或者网页都使用懒汉模式,因为饿汉模式需要一次将全部的资源加载完,会很费时间,还有就是有一些有相互依赖的类,需要先生成前置类之后才能生成目标类,因为位饿汉模式不能保证实例化的顺序,需要手动在懒汉模式下调整。下图贴上懒汉模式的代码样例: