版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C(也可能因为它完全映射了计算机硬件,所以操作效率高,是C/C++高效的根源。当然,这也是引起无数麻烦的根源。无效数据、指针越界,或者内存分配后没有及时释放,就会导致运其他的编程语言,比如Java、Go就没有这方面的顾虑,因为它们内置了一个“回其实,C++里也是有回收的,不过不是Java、Go那种严格意义上的回收,而是广义上的回收,这就是构造/析构函数和RAII惯用法(ResourceAcquisitionIs样当对象失效销毁时,C++就会自动调用析构函数,完成内存释放、资源回收等清理工和Java、Go相比,这算是一种型的回收机制,而且回收的时机完全自主可智能指针就是代替你来干这些“脏活累活”的。它完全实践了RAII,包装了指针,而且因为重载了*和->操作符,用起来和原始指针一模一样。unique_ptr和shared_ptr认识unique_ptr是最简单、最容易使用的一个智能指针,在的时候必须用模板参数指定类代代1234567unique_ptr<int>ptr1(newint(10));assert(*ptr1=10);assert(ptr1!=//int//可以使用*//unique_ptr<string>ptr2(newstring("assert(*ptr2==" assert(ptr2->size()==o"));//string//可以使用*//可以使用->你需要注意的是,unique_ptr虽然名字叫指针,用起来也很像,但它实际上并不是指针,而是一个对象。所以,不要企图对它调用delete,它会自动管理初始化时的指针,在离开代代ptr2+=////delete、加减运算,初学智能指针还有一个容易犯的错误是把它当成普通对象来代代unique_ptr<int>*ptr3=42//unique_ptr命的错误(比如coredump)。为了避免这种低级错误,你可以调用工厂函数make_unique(),强制创建智能指针的时候 第6讲)的auto,少写一些代码:代代12345autoptr3=assert(ptr3&&*ptr3==//autoptr4=make_unique<string>("godof不过,make_unique()C++14,C++11,也可以自己实现一个简化版的make_unique(),可以参考下面的代码:代代1234567te<classT,class...my_make_unique(Args&&...{return//////可变参数模板 //new//}unique_ptr使用unique_ptr所有权为了实现这个目的,unique_ptr应用了C++的“转移”(move)语义,同时了拷贝赋值,所以,在向另一个unique_ptr赋值的时候,要特别留意,必须用std::move()函数代代112345autoptr1=assert(ptr1&&*ptr1==autoptr2=使用move()里你只要记住,尽量不要对unique_ptr认识接下来要说的是shared_ptr,它是一个比unique_ptr初看上去shared_ptr和unique_ptr*代代123456789shared_ptr<int>ptr1(newassert(*ptr1=//int//可以使用*shared_ptr<string>ptr2(newassert(*ptr2==o"));//string//可以使用*autoptr3=make_shared<int>(42);//assert(ptr3&&*ptr3==//autoptr4=make_shared<string>("zelda");////可以使用->shared_ptrunique_ptr它的所有权是可以被安代代1234567autoptr1=assert(ptr1&&ptr1.unique()////autoptr2=assert(ptr1&&//直接拷贝赋值,不需要使用//assert(ptr1==//shared_ptr889//assert(!ptr1.unique()assert(!ptr2.unique()ptr1.use_count()==ptr2.use_count()==shared_ptr支持安全共享的在于了“计数”计数最开始的时候是时候,计数就增加,而发生析构销毁的时候,计数就减少。只有当计数减少到0,也就是说,没有任何人使用这个指针的时候,它才会真正调用delete释放内存。shartr(即可以拷贝赋值)它可以在任何场合替代原始指针,而不用再担心资源回收的问题,比如用于容器指针、用于函数安全返回动态创建的对象,等等。shared_ptrshared_ptrunique_ptr虽然shared_ptr非常“智能”,但天下没有免费的午餐,它也是有代价的,计数的存储和管理都是成本,这方面是shared_ptr不如unique_ptr的地方。shared_ptr心,shared_ptr内部有很好的优化,在非情况下,它的开销都很小。另外一个要注意的地方是shared_ptr的销毁动作因为我们把指针交给了shared_ptr去自动管理,但在运行阶段,计数的变动是很复杂的,很难知道它真正释放资源的时机,无法像Java、Go那样明确掌控、调整回收机你要特别对象的析构函数,不要有非常复杂、严重阻塞的操作。一旦shared_ptr在某动”(Go)。这也是我以前遇到的实际案例,排查起来费了很代代123456789classDemoShared{DemoShared()={//StopTheWorld}////复杂的操作会导致shared_ptrshared_ptr的计数也导致了一个新的问题,就是“循环”,这在把代代123456789classNode{usingthis_typeusingshared_type==//auton1=auton2=////n1->next=n2->next=////无法减到0在这里,两个节点指针刚创建时,计数是1,但指针互指(即拷贝赋值)之后,数都变成了2。这个时候,shared_ptr就“犯傻”了,意识不到这是一个循环,多算了一次计数,后果就是计数无法减到0,无法调用析构函数执行delete,最终导致内存泄漏。这个例子很简单,你一下子就能看出存在循环。但在实际开发中,指针的关系可不像例子那么清晰,很有可能会不知不觉形成一个链条很长的循环,复杂到你根本无法识别,想要从根本上杜绝循环,光靠shared_ptr是,必须要用到它的“小帮手weak_ptr顾名思义,功能很“弱”。它专门为打破循环而设计,只观察指针,不会增 lock(),获取刚才的例子里,只要你改用weak_ptr,循环的烦恼就会烟消云散代代123456789classNode{using=//注意这里,别名改用using= //auton1=make_shared<Node>();//auton2=make_shared<Node>();//n1->next=n2->next=//assert(n1.use_count()==//因为使用了 assert(n2.use_count()== //打破循 if(!n1->next.expired())//autoptr=n1->next.lock();//lock()获取assert(ptr==}好了,今天就先到这里。智能指针的话题很大,但是学习的时候我们不可能一下子把所有知识点都穷尽,有优先级。所以我会捡最要紧的先介绍给你,剩下的接口函数等细节,还是需要你根据自己的情况,再去参考一些其他资料深入学习的。智能指针是模式的具体应用,它使用RAII技术了指针,能够自动释放内存,如果指针是“独占”使用,就应该选择unique_ptr,它为指针添加了很多限制,更加shared_ptr,它的功能非常完善,用法几乎与原make_unique()、make_shared()而且还能使用auto来简化。shared_ptr有少量的管理成本,也会一些难以排查的错误,所以不要过度使用。既然你已经理解了智能指针,就尽量不要再使用指针、new和delete来操作内存了存泄漏,你也就不需要去费心研究、使用valgrind等内存调试工具了,生活也会更“美好”unique_ptr和shared_ptr你觉得应该如何在程序里“消灭”new和 不得售卖。页面已增加防盗追踪,将依法其上一 07|const/volatile/mutable:常量/变量究竟是怎么回事下一 09|exception:怎样才能用好异常为什么才3000多订阅人数?62我的理解是Uniquepointer是对象而不是指针,但重载了*和箭头,离开了对象的作用11说实话,unique_ptr比起指针性进步,但是shared_ptr有点overengineering,er尽管有moe可以进行转移,但是同一时刻ptr是不是只允许转移到一个ptr,而之前转移成功的后续逻辑还没有执行完…作者回复:如new[100]来缓存100帧图像数据,请问下,c++11中智能指针如何去管理new数组,谢1 shared_ptr与unique_ptr最大区别就在于前者可以多个指针共个对象或元素,而后者使用堆内存新建对象均使用智能指针,就可以不用shared_ptr”(即可以拷贝赋值循环,资源消耗,线程安全等问题。大部分时候,unique_ptr是能完全取代指针classApublic:virtual~A()default;};classB:publicA{};//共有继承classHolderA{public:std::shared_ptr<A>data;};A即可1 xp系统太老
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 卧床病人动静脉穿刺护理
- 职务移交事项确认承诺函范文3篇
- 科技研发推广合作承诺函8篇
- 演讲比赛中的我勇敢面对挑战演讲稿10篇
- 智能风险评估与管理模板
- 漫步在花海中写景8篇
- 工程招标及投标管理工具
- 建筑安全稳定责任承诺书5篇
- 教育机构课程开发合同模板
- 护理课件:急救护理与心肺复苏
- 2026年陕西铁路工程职业技术学院单招职业适应性测试题库完整参考答案详解
- 2026年安徽国防科技职业学院单招职业技能考试题库及完整答案详解一套
- 《特大型突发地质灾害隐患点认定与核销管理办法(试行)》
- XX街道中学初中部2026年春季家长会中期筹备工作方案:筹备家长会搭建沟通平台
- 2025年时事政治必考试题库(附含答案)
- 2026年汽车制造机器人自动化率提升:趋势、技术与实践
- 作业条件危险性评价方法LEC及案例分析
- 初中英语中考短文填空题型考点精析与知识清单
- 城市公共交通运营与服务规范
- 2026年1月浙江省高考首考英语试卷真题完整版(含答案+听力)
- 2026年国轩高科行测笔试题库
评论
0/150
提交评论