对于普通指针在日常使用的时候会面临一个释放问题,一种可以保证释放不会出错的方式就是谁申请谁释放
但是这种方式实际使用的时候局限性太大,比如说某个函数的功能就是去释放内存,很明显它不能够去释放自己申请的内存
指针释放经常会出现两方面的问题:
1、内存泄漏
2、重复释放
因此引入智能指针,智能指针分为强智能指针和弱智能指针
强智能指针:
智能指针的实现都是对普通指针的一个封装,在封装的时候引入一个引用计数,这个引用计数记录该内存块被引用的次数,在释放内存的时候判断引用计数是否为0,不为0则说明该内存快仍然在被别的指针使用,就不释放内存,而是将引用计数减一,直到引用计数减为0的时候再释放内存
强智能指针的时候存在一个问题:交叉引用
假设类A内部有一个B类型的强智能指针b,同时B类内部有一个A类型的强智能指针a
然后实例化对象aa和bb,此时a对象和b对象所在内存的引用计数为1
再做如下操作:aa.b = bb; bb.a = aa.此时a对象和b对象所在内存的引用计数为2
那么在程序结束时进行内存释放,aa对象和bb对象的引用计数均减一,还是1,此时内存并没有被释放,造成内存泄漏
因此引入弱智能指针:
弱智能指针和强智能指针的实现是差不多的,只是弱智能指针只观测引用计数,并不增加引用计数的大小
因此在使用智能指针的过程中规定只有在定义的时候使用强智能指针,在其他地方均使用弱智能指针
这样就解决了强智能指针带来的交叉引用的问题