产生原因:
C++没有自动内存回收机制。
平常我们在使用C++开发过程中,动态申请内存,使用new或malloc,然后通过指针去使用;
那么,使用结束以后,必须要显式的调用delete或free操作,释放对应的动态存储空间,不然就会产生内存泄露的问题。
这整个操作是需要程序员去进行,程序员的不小心就 很容易造成内存泄露的问题。而且内存泄露问题一般隐藏比较深,难以发现,也难以定位。
基于以上原因,有了智能指针。
技术原理:
对于编译器而言,智能指针实际上是个栈对象,并非指针类型。所以在栈对象生命周期结束时,会自动调用该对象的析构函数,释放它管理的堆。这样,智能指针就可以方便的控制对象的生命周期。
智能指针本身是一个对象,它对裸指针做了一层包装。
智能指针类型:
auto_prt : 使用起来有较多坑,不建议使用。(C++11中已被弃用)
unique_ptr: 其所指向的对象在作用域之外会自动得到析构。它是non-copyable的,禁止了赋值运算符和拷贝构造,这样是为了避免同一个对象被多次析构,没有release()函数。控制权唯一。无法使两个unique_ptr指向同一个对象。
可实现功能 :
1、为动态申请内存提供异常安全。
2、将动态申请的内存所有权传递给某函数。
3、从某个函数返回动态申请内存的所有权。
4、在容器中保存指针。
shared_ptr:该类型智能指针支持拷贝和赋值的,那么它引入了引用计数器,避免多次析构的问题,每复制一次计数器+1,指针退出作用域,则计数器-1,直到最后一次析构,才会真正的删除对象,这样就避免了多次析构的问题。
release():当前指针会释放资源所有权,计数减一。
weak_ptr:为shared_ptr而准备的,是为了解决shared_ptr相互引用的死锁问题,如果两个share_ptr相互引用,那么这两个指针的引用计数永远不可能下降为0,只对shared_ptr进行引用,不改变其引用计数。
引用计数器是线程安全的。
它同样用于管理单个堆内存对象。
以上为常用的三种。
另外,还有用于管理多个堆内存对象的智能指针对象,在此不论。
应用场景:
确定对象无需共享的情况下,使用unique_ptr
确定对象需要共享的情况下,使用shared_ptr
weak_ptr一般常用于软件框架设计中,没用过。
智能指针的操作:
访问智能指针本身的方法使用 . 操作符。
智能指针重载了 -> 操作符,用于操作裸指针所指向的对象。
get(); 获取智能指针的裸指针
reset() ; 安全便捷的删除智能指针,可以用于主动删除智能指针,如在中途删除智能指针释放资源,而不是等被动调用析构函数。
若传递参数,会释放当前内存,重新管理新传入对象。
release():