智能指针
一:智能指针的发展历史
首先为什么要引入智能指针
当new
与 delete 配对使用时,在delete的中间有一些譬如break,return之类的语句,程序直接跳出了,那new出来的空间就没有释放,那样就会造成内存泄漏的危害
那么这种问题如何解决呢?
有这样一种思想,RAII(Resource Acquisition Is Initialization)资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源
的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。
那么程序也可以利用这种思想来解决问题:这样的话,当你就算使用return 跳出的时候,你程序结束便会调用析构函数,自动的完成清理工作,而减少因未释放内存
二·:auto_ptr/scoped_ptr/shared_pr/weak_ptr的设计思想、缺陷?及模拟实现
auto_ptr 是比较早期提出来的设计思想 他是这样实现的,看他的构造函数是直接把指针交给下一个
具有管理权的人,在把自身至为NULL
缺陷: 不符合指针的使用,不能说拷贝构造一个指针就把原指针至NULL了,同时当时用* 或者->运算符时,可能也会造成程序的崩溃等一系列问题。
scoped_ptr 守卫指针(防拷贝),设计思想:当你想使用时,不让你用有两种方法限制::1如上图把成员变量设置为私有的,让不让外部的访问2:只声明,不定义变量(不实现)这样别人再用时就call不上了。
缺陷:简单粗暴,直接不让人使用了。一点都不给用还是没从根本上解决问题。
shared_pr:共享指针,引用计数。比起上个scoped_ptr指针来说,并没有那么粗暴,让别人使用了同时也解决了大多数问题(再开辟一个空间,专门记录指向原空间指针的个数,只有当_refcount
== 0 的时候才释放空间,反之不释放)
三:分析循环引用及解决方案.
虽然shared_ptr能够解决大多数问题,但是shared_ptr有一个缺陷,就是循环使用没办法解决
引用计数永远减不下来,永远释放不了
解决方法::weak_ptr指针的引用
弱指针,不能单独存在,用于解决shared_ptr循环引用的问题
实现的原理是:当遇到这种原理是把指针给给_ptr, 但是引用计数是不增加的