四种智能指针

智能指针的原理:

智能指针不是指针,它实际上是一个模板,由智能指实例化出来的对象具有和常规指针相似的行为,重点是智能指针负责自动的释放所指对象。智能指针是一个类,它的释放空间是通过析构函数完成的。
智能指针使用了RAII技术。RAII叫做资源获得及初始化,定义一个类来封装资和初始化源的分配和释放,在构造函数内完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。

智能指针的种类:

最开始C++标准库里面是没有智能指针的,直到C++11中才引入了shared_ptr和unique_ptr以及weak_ptr,最早的智能指针在boost库里面。

boost库中的智能指针:

auto_ptr: 通过权限转移的方式来防止由浅拷贝所带来的问题,所谓权限转移就是说开辟的内存在任何时刻都只能由一个指针指向。

1.不要适用auto_ptr保存一个非动态开辟空间的指针,因为在作用域结束的时候,会执行智能指针的析构函数,释放这块空间,但非动态的空间又无法释放*
2.不要使用两个auto_ptr指针指向同一个指针
3.不要使用auto_ptr指向一个指针数组,因为auto_ptr的析构函数用的是delete不是delete【】
4.不要将auto_ptr存在容器中,因为赋值和拷贝构造后原指针无法使用

scoped_ptr: 为了防止浅拷贝,socped_ptr从根本上就不允许拷贝和赋值。(防赋值、防拷贝,把赋值运算符重载和拷贝构造声明为私有成员函数,只声明不定义)scoped_array是用来管理数组的。

shared_ptr: 允许拷贝和赋值,其底层是以”引用计数”为基础的,通过引用计数来控制空间的释放,当一块空间创建时引用计数为1,当有新的指针指向这块空间时,引用计数加1,反之减1,直到引用计数减到0时才真的释放这块空间。shared_array用来管理数组的。
shared_ptr注意不要有循环引用,否则会出现内存泄漏。例如:A和B对象互相引用,它们的引用计数都是1,当出了作用域之后,二者不能自动释放,出现了内存泄漏。

weak_ptr:它对被 std::shared_ptr 管理的对象存在非拥有性(“弱”)引用。在访问所引用的对象前必须先转换为 std::shared_ptr。
weak_ptr是一个弱引用,只引用,不计数。如果一块内存被shared_ptr和weak_ptr同时引用,当所有shared_ptr析构了之后,不管还有没有weak_ptr引用该内存,内存也会被释放。所以weak_ptr不保证它指向的内存一定是有效的,在使用之前需要检查weak_ptr是否为空指针。
此外,std::weak_ptr 还可以用来避免 std::shared_ptr 的循环引用。

C++11中的智能指针:

C++中的shared_ptr允许多个指针指向同一个对象向。unique_ptr则独占所指对象。weak_ptr是一种弱引用,用来解决shared_ptr中的循环引用问题。

shared_ptr的缺陷、为什么不用原生指针替换weak_ptr

shared_ptr的缺点:
引用计数存在线程安全问题。循环引用问题。例如用智能指针实现一个双向链表,双向链中的前驱和后继指针用的均是智能指针,则在销毁链表的时候,由于两个结点的销毁都依赖于对方先销毁,这时就会出现错误。为了解决循环引用问题,我们可以使用weak_ptr,weak_ptr不增加引用计数。
为什么不用原生指针替换weak_ptr:
弱引用并不修改该对象的引用计数,这意味着弱引用它并不对对象的内存进行管理。在功能上类似于普通指针,然而一个较大的区别是,弱引用能检测到所管理的对象是否已经被释放,从而避免访问非法内存

创建资源时,使用强智能指针,其他地方使用弱智能指针,给弱智能指针升级

多线程环境-》怎样在多线程环境中,安全的访问共享的对象?
1.创建对象的线程中,用强智能指针
2.访问共享对象时,用弱智能指针

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值