84、智能指针的原理、常用的智能指针及实现.pdf
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
84、智能指针的原理、常⽤的智能指针及实现 、智能指针的原理、常⽤的智能指针及实现 原理 智能指针是⼀个类,⽤来存储指向动态分配对象的指针,负责⾃动释放动态分配的对象,防⽌堆内存泄漏。动态分配的资源,交给⼀个类对 象去管理,当类对象声明周期结束时,⾃动调⽤析构函数释放资源 常⽤的智能指针 (1) shared_ptr 实现原理:采⽤引⽤计数器的⽅法,允许多个智能指针指向同⼀个对象,每当多⼀个指针指向该对象时,指向该对象的所有智能指针内部的 引⽤计数加1,每当减少⼀个智能指针指向对象时,引⽤计数会 减1,当计数为0的时候会⾃动的释放动态分配的资源。 a.智能指针将⼀个计数器与类指向的对象相关联,引⽤计数器跟踪共有多少个类对象共享同⼀指针 b.每次创建类的新对象时,初始化指针并将引⽤计数置为1 c.当对象作为另⼀对象的副本⽽创建时,拷贝构造函数拷贝指针并增加与之相应的引⽤计数 d.对⼀个对象进⾏赋值时,赋值操作符减少左操作数所指对象的引⽤计数(如果引⽤计数为减⾄0, 则删除对象),并增加右操作数所指对 象的引⽤计数 e.调⽤析构函数时,构造函数减少引⽤计数(如果引⽤计数减⾄0,则删除基础对象) (2) unique_ptr unique_ptr采⽤的是独享所有权语义,⼀个⾮空的unique_ptr总是拥有它所指向的资源。转移⼀个 unique_ptr将会把所有权全部从源指针转 移给⽬标指针,源指针被置空;所以unique_ptr不⽀持普通的 拷贝和赋值操作,不能⽤在STL标准容器中;局部变量的返回值除外(因为编 译器知道要返回的对象将 要被销毁);如果你拷贝⼀个unique_ptr,那么拷贝结束后,这两个unique_ptr都会指向相同的资源, 造成在结束 时对同⼀内存指针多次释放⽽导致程序崩溃。 (3) weak_ptr weak_ptr:弱引⽤。 引⽤计数有⼀个问题就是互相引⽤形成环(环形引⽤),这样两个指针指向的内 存都⽆法释放。需要使⽤weak_ptr打 破环形引⽤。weak_ptr是⼀个弱引⽤,它是为了配合shared_ptr ⽽引⼊的⼀种智能指针,它指向⼀个由shared_ptr管理的对象⽽不影响所指 对象的⽣命周期,也就是 说,它只引⽤,不计数。如果⼀块内存被shared_ptr和weak_ptr同时引⽤,当所有shared_ptr析构了之 后,不管还 有没有weak_ptr引⽤该内存,内存也会被释放。所以weak_ptr不保证它指向的内存⼀定是 有效的,在使⽤之前使⽤函数lock()检查weak_ptr 是否为空指针。 (4) auto_ptr 主要是为了解决"有异常抛出时发⽣内存泄漏"的问题 。因为发⽣异常⽽⽆法正常释放内存。 auto_ptr有拷贝语义,拷贝后源对象变得⽆效,这可能引发很严重的问题;⽽unique_ptr则⽆拷贝语 义,但提供了移动语义,这样的错误不 再可能发⽣,因为很明显必须使⽤std::move()进⾏转移。 auto_ptr不⽀持拷贝和赋值操作,不能⽤在STL标准容器中。STL容器中的元素经常要⽀持拷贝、赋值操 作,在这过程中auto_ptr会传递所有 权,所以不能在STL中使⽤。
- 粉丝: 167
- 资源: 3万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助