智能指针——C++

产生原因:

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():


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值