c++11中的智能指针

        在C++11中有四种智能指针,auto_ptr,shared-ptr,unique_ptr和weak-ptr,其中auto_ptr有许多不足之处,在C++11中已经建议废弃使用。

1. shared_ptr

    std::shared_ptr智能指针可以通过共享指向对象的所有权,从而实现对对象的动态管理。std::shared_ptr一般不会拥有对象,相反,所有指向对象的std::shared_ptr指针合作起来确保在对象不需要时析构被调用。当最后一个指向对象的std::shared_ptr不再指向该对象时(比如该std::shared_ptr被销毁或者指向别的对象),这个std::shared_ptr会销毁它指向的对象。就像垃圾回收一样,用户自己不用关心被指向对象的生存周期,同时对析构来说,对象的析构时间是确定的。

   一个std::shared_ptr可以通过查询指向对象的引用计数来得到它是否是最后一个指针,引用计数是一个和资源关联的值,它记录了有多少std::shared_ptr指向该资源。std::shared_ptr构造函数中会增加引用计数,析构函数汇总减小引用计数(通常是这样---见下面),拷贝复制操作两者都执行。(假如sp1和sp2指向不同的对象,操作“sp1=sp2;”会修改sp1,指向sp2,结果就是原来sp指向的对象的引用计数减少了,同时sp2指向的对象的引用计数增加了。)当一个std::shared_ptr 指针看到对象的引用计数在指向完减一操作后变为0时,那么没有std::shared_ptr指向该对象了,于是std::shared_ptr将会销毁它。

2. unique_ptr

    通常可以认为std::unique_ptr和原始指针有相同的尺寸,并且对于多数操作(包括解引用),它和原始指针有几乎相同的指令。这意味着你可以在内存和cpu紧张的地方使用它,如果普通的原始指针对你够快够用的话,那么std::unique_ptr几乎也是够用的。

    std::unique_ptr实现了独享所有权的语义。一个非空的std::unique_ptr总是拥有它所指向的资源。转移一个std::unique_ptr将会把所有权也从源指针转移给目标指针(源指针被置空)。拷贝一个std::unique_ptr将不被允许,因为如果你拷贝一个std::unique_ptr,那么拷贝结束后,这两个std::unique_ptr都会指向相同的资源,它们都认为自己拥有这块资源(所以都会企图释放)。因此std::unique_ptr是一个仅能移动(move_only)的类型。当指针析构时,它所拥有的资源也被销毁。默认情况下,资源的析构是伴随着调用std::unique_ptr内部的原始指针的delete操作的。

  std::unique_ptr通常出现两种形式。一种是单个对象(std::unique_ptr<T>),另一种是数组(std::unique_ptr<T[]>)。标准库提供了一个可以管理new分配数组的unique_ptr版本,为了用一个unique_ptr管理动态数组,我们必须在对象类型后面跟一对方括号。

unique_ptr<int[]>up(new int[10]);
up.realese();//自动用delete[]销毁其指针。
当unique_ptr指向数组时我们不能使用点和箭头运算符,而是用下标来访问数组中的元素:
for(size_ti=0;i I != 10; ++i)
up[i]=i;
unique_ptr<T[]>u //u指向一个类型为T的动态分配的数组
unique_ptr<T[]>u (p) //u指向内置指针p所指向的动态分配的数组。P必须能转换为类型T*
u[i] //返回位置i的元素


3. weak-ptr

   有时候,我们需要一个灵巧指针可以像std::shared_ptr一样方便,但又不参与管理被指对象的所有权。换句话说,需要一个像std::shared_ptr但又不影响对象引用计数的指针。这类指针会有一个std::shared_ptr没有的问题:被指的对象有可能已经被销毁。一个良好的灵巧指针应该能处理这种情况,通过跟踪什么时候指针会悬浮,比如在被指对象不复存在的时候。这正是std::weak_ptr这类型灵巧指针所能做到的。

  weak_ptr是一种不控制所指向对象生存期的智能指针,它指向一个shared_ptr管理的对象。将一个weak_ptr绑定到shared_ptr不会改变shared_ptr的引用计数。一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放,即使有weak_ptr指向对象,对象还是会被释放。
当我们创建一个weak_ptr时,要用一个shared_ptr来初始化它:

auto p=make_shared_ptr<int>(42);
weak_ptr<int>wp(p); //wp弱共享p,p的引用计数未改变

由于对象可能不存在,我们不能使用weak_ptr直接访问对象,而必须调用lock().此函数检查weak_ptr指向的对象是否存在。如果存在lock则返回一个指向共享对象的shared_ptr,同时该对象的引用计数会增加。
   
if(shared_ptr<int> np= wp.lock())
{
}

      std::weak_ptr可以和std::shared_ptr 一起解决引用计数的循环引用问题。

     具体可参考《std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题》



参考文献:

1. c++11 条款19:使用std::shared_ptr来进行共享所有权的资源管理

2. c++11 条款20:使用std::weak_ptr作为一个类似std::share_ptr但却能悬浮的指针

3. c++11 条款18: 使用std::unique_ptr来进行独享所有权的资源管理

4. C++ 智能指针shared-ptr,unique_ptr和weak-ptr

5.      [C++11]_[初级]_[shared_ptr的使用场景]

6.      [C++11]_[初级]_[unique_ptr的使用场景]

7.      [C++11]_[初级]_[weak_ptr的使用场景]

8.    【C++11新特性】 C++11智能指针之unique_ptr

9.    【C++11新特性】 C++11智能指针之shared_ptr

10 .  【C++11新特性】 C++11智能指针之weak_ptr


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu14.04设置静态IP

啊&#xff0c;最近懒惰了&#xff0c;好久没有写博客了。 一般机器启动的时候会自动从DHCP服务器上面获取动态IP地址&#xff0c;这是一件很方便的事情&#xff0c;可以不用手动设置网络相关的蚕参数&#xff0c;但是有时候还是需要机器固定IP地址的。 第一步&#xff0c;编辑…

高中学历python培训靠谱吗_高中学历学完Python就能干人工智能?

最近Python大热&#xff0c;主要是人工智能的热度&#xff0c;昨天后院活动部介绍了一位女网友为男朋友选择Java还是Python&#xff0c;大量的程序员热议&#xff0c;也有人询问如何学习Python&#xff0c;比如这位网友询问高中学历学习Python是不是就能干人工智能。兄弟&#…

curl+个人证书(又叫客户端证书)访问https站点

目前&#xff0c;大公司的OA管理系统&#xff08;俗称内网&#xff09;&#xff0c;安全性要求较高&#xff0c;通常采用https的双向 认证模式。 首先&#xff0c;什么是https&#xff0c;简单的说就是在SSL协议之上实现的http协议&#xff08;get、post等操作&#xff09;。更…

boot.oat FC问题分析报告

【NE现场】 pid: 5252, tid: 5252, name: ndroid.contacts >>> com.android.contacts <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x1458x0 0000000000000000 x1 0000000090d9892c x2 0000000000000001 x3 000000000000012cx4 …

c++ 虚函数的实现机制

转载自&#xff1a;http://blog.csdn.net/jiangnanyouzi/article/details/3720807 1、c实现多态的方法 其实很多人都知道&#xff0c;虚函数在c中的实现机制就是用虚表和虚指针&#xff0c;但是具体是怎样的呢&#xff1f;从more effecive c其中一篇文章里面可以知道&#xff…

powerdesigner 技巧

1.修改建表脚本生成规则。如果每个表格都有相同的字段&#xff0c;可以如下修改&#xff1a; Database -> Edit Current DBMS 展开 Script -> Object -> Table -> Create 见右下的Value值&#xff0c;可以直接修改如下&#xff1a;/* tablename: %TNAME% */ create…

勒索病毒攻击应急防范

北京时间5月12日&#xff0c;互联网上出现针对Windows操作系统的勒索软件&#xff08;Wannacry&#xff09;攻击案例。勒索软件利用此前披露的Windows SMB服务漏洞&#xff08;对应微软漏洞公告&#xff1a;MS17-010&#xff09;攻击手段&#xff0c;向终端用户进行渗透传播&am…

C++中虚析构函数的作用

C中的虚析构函数到底什么时候有用的&#xff0c;什么作用呢。 总的来说虚析构函数是为了避免内存泄露&#xff0c;而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的&…

苹果Swift编程语言入门教程【中文版】

http://www.25pp.com/news/news_60984.html转载于:https://www.cnblogs.com/niaowo/p/4564298.html

python正则表达式匹配aabb_Python正则表达式拆分多个匹配项

我正在尝试将包含2个不同字符的序列的字符串拆分为多个组.如果我们假设字符是a和b,则用于分组的纯文本规则为&#xff1a;>组包含0 a,后跟1 b>后面的所有a都包含在下一组中,除非我们在单词末尾.例如&#xff1a;处理测试后,目标是分成预期的组.tests [abab,ababab,aabab…

MEF 导入(Import)和导出(Export)

前言&#xff1a; MEF不同于其他IOC容器&#xff08;如&#xff1a;Castle&#xff09;很重要的原因在于它使用了特性化编程模型&#xff08;涉及到两个概念&#xff1a;“特性”和“编程模型”&#xff09;。 特性&#xff08;Attribute&#xff09;&#xff1a;举例来说就是我…

Android SimpleAdapter的参数

1.作用是ArrayList和 ListView的桥梁。这个ArrayList里边的每一项都是一个Map<String,?>类型。 ArrayList当中的每一项 Map对象都和ListView里边的每一项进行数据绑定一一对应。2.SimpleAdapter的构造函数&#xff1a;SimpleAdapter(Context context, List<? …

JMeter 教程汇总链接

http://www.360doc.com/content/14/0318/23/16361380_361732630.shtml 可以作为入门系列教程。 尽管网页也给出了视频链接&#xff0c;但是我不建议看视频学习&#xff01; 建议直接看文字&#xff08;可以跳跃式学习&#xff0c;视频的则是线性学习&#xff09;转载于:https:…

C++ STL中set底层实现方式

Q&#xff1a;STL中set底层实现方式&#xff1f; 为什么不用hash&#xff1f; A: 第一个问题:set底层实现方式为RB树&#xff08;即红黑树&#xff09;。 第二个问题: 首先set&#xff0c;不像map那样是key-value对&#xff0c;它的key与value是相同的。关于set有两种说法&…

python自动获取天气_用python获取天气数据,并作定时播报

原标题&#xff1a;用python获取天气数据&#xff0c;并作定时播报数据挖掘入门与实战 公众号&#xff1a; datadw思路1.调用和风天气的API&#xff0c;获取天气数据2.用百度语音API&#xff0c;将天气数据合成语音3.用树莓派每天早上定时播报天气(定时任务crontab Python脚本…

c++实现解析文件路径

注意&#xff1a;本实现只能解析类似linux下的路径&#xff0c;即“/data/a.txt”&#xff0c;而不能解析“c:\a.txt” 或者“c:\\a.txt”&#xff0c;但是应该很容易扩展改写实现此功能。 FilepathParse.h #include <string> using std::string;void parseFilepath(str…

gedit搭建c开发环境

在管理外部工具中&#xff0c;创建启动脚本 1 #!/bin/sh 2 DIR$GEDIT_CURRENT_DOCUMENT_DIR 3 NAME$GEDIT_CURRENT_DOCUMENT_NAME 4 /home/lxy/code/c/struct/run.sh ${DIR}/${NAME} 创建run.sh #!/bin/sh file$1 ext${file##*.}#C if [ $ext "c" ]; thenif [ -f $f…

Oracle数据库入门——常用的数据字典

一、oracle数据字典主要由以下几种视图构成&#xff1a;1.user视图以user_为前缀&#xff0c;用来记录用户对象的信息 2.all视图以all_为前缀&#xff0c;用来记录用户对象的信息及被授权访问的对象信息 3.dba视图以dba_为前缀&#xff0c;用来记录数据库实例的所有对象的信息 …

一个excel文档里复制黏贴另外表单跟着变动_利用Excel连接Power BI,实现PPT报告自动输出...

​文/HALI就职于汽车行业战略部门 专注汽车市场信息情报收集和分析因为工作需要&#xff0c;每月周期性的更新数据和撰写PPT 报告成为繁重的劳动。结果是很多时间花费在数据处理上&#xff0c;真正的分析工作&#xff0c;往往只能草草收场。不能坐以待毙&#xff0c;就要想想有…