博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
智能指针shared_ptr
阅读量:2051 次
发布时间:2019-04-28

本文共 1363 字,大约阅读时间需要 4 分钟。

auto_ptr由于它的破坏性复制语义,无法满足标准容器对元素的要求,因而不能放在标准容器中;如果我们希望当容器析构时能自动把它容纳的指针元素所指的对象删除时,通常采用一些间接的方式来实现,显得比较繁琐。boost库中提供了一种新型的智能指针shared_ptr,它解决了在多个指针间共享对象所有权的问题,同时也满足容器对元素的要求,因而可以安全地放入容器中。

当出现以下情况时应该优先考虑使用shared_ptr:

1.有多个使用者共同使用同一个对象,而没有一个明显的拥有者。
2.一个对象的复制操作很昂贵。
3.要把指针存入标准库容器。
4.要传送对象到库或从库获取对象,而这些对象没有明确的所有权。
5.当管理需要特殊清除方式的资源时,这时可以通过定制shared_ptr的删除器
来实现。

template<class Other> explicit shared_ptr(Other *ptr);

这个构造函数获得给定指针ptr的所有权。构造后引用计数设为1,构造完成后将获得一个跟ptr指向相同对象的shared_ptr。

template <class Y,class D> shared_ptr(Y* p,D d);

这个构造函数带有两个参数。第一个是shared_ptr将要获得所有权的那个资源,第二个是shared_ptr被销毁时负责释放资源的一个对象,被保存的资源将以d(p)的形式传给那个对象。因此p的值是否有效取决于d。如果引用计数器不能分配成功,shared_ptr抛出一个类型为std::bad_alloc的异常。

shared_ptr(const shared_ptr& sp);

这个复制构造函数可以方便使用一个shared_ptr构造另外一个shared_ptr,原有shared_ptr中保存的资源将被新构造的shared_ptr所共享,引用计数加1.

shared_ptr& operator=(const shared_ptr& r);

赋值操作共享r中的资源,并停止对原有资源的共享。赋值操作不会抛出异常。

void reset();

reset函数用于停止对保存指针的所有权的共享。共享资源的引用计数减一。

T* get() const;

get函数是当保存的指针有可能为空时(这时 operator*operator-> 都会导致未定义行为)获取它的最好办法。注意,你也可以使用隐式布尔类型转换来测试 shared_ptr 是否包含有效指针。这个函数不会抛出异常。

shared_ptr带来的两个问题:

1.体积问题
因为shared_ptr需要进行引用计数,所以它需要额外的内存空间来保存当前内存资源的引用数,这使得一个shared_ptr指针将占用40个字节的内存空间,是一个普通指针所占用内存空间的整整10倍。
2.性能问题
一方面,因为引用技术,shared_ptr需要在运行时对引用计数进行管理和维护,这样就必然需要消耗额外的计算资源,影响程序的性能。另一方面,shared_ptr使用了大量的虚函数,虚函数的使用也带来了一定的性能损失。

shared_ptr所管理的资源的清理工作都是由删除器(deleter)来完成的。

轻量级的智能指针:unique_ptr

转载地址:http://dwklf.baihongyu.com/

你可能感兴趣的文章
【Pyton】【小甲鱼】类和对象
查看>>
压力测试工具JMeter入门教程
查看>>
作为一名软件测试工程师,需要具备哪些能力
查看>>
【Pyton】【小甲鱼】类和对象:一些相关的BIF(内置函数)
查看>>
【Pyton】【小甲鱼】魔法方法
查看>>
单元测试需要具备的技能和4大阶段的学习
查看>>
【Loadrunner】【浙江移动项目手写代码】代码备份
查看>>
Python几种并发实现方案的性能比较
查看>>
[Jmeter]jmeter之脚本录制与回放,优化(windows下的jmeter)
查看>>
Jmeter之正则
查看>>
【JMeter】1.9上考试jmeter测试调试
查看>>
【虫师】【selenium】参数化
查看>>
【JMeter】如何用JMeter进行压力测试
查看>>
【Python练习】文件引用用户名密码登录系统
查看>>
学习网站汇总
查看>>
【Python】用Python打开csv和xml文件
查看>>
【Loadrunner】性能测试报告实战
查看>>
【面试】一份自我介绍模板
查看>>
【自动化测试】自动化测试需要了解的的一些事情。
查看>>
【selenium】selenium ide的安装过程
查看>>