c++系列:智能指针share_ptr,unique_ptr,weak_ptr

share_ptr作用:相当于一个容器,托管堆指针,实现智能释放堆内存,支持同个堆指针被多个容器托管

原理:利用容器临时变量的销毁,触发析构函数,将引用计数减少,引用计数为0则将堆指针安全释放

初始化:

share_ptr<A> ptrA(new A())//正确,堆指针为指向new A()的地址

share_ptr<A> ptrA = (new A())//错误,没有这种构造函数

share_ptr<A> ptrB(ptrA)//正确,ptrB.UseCount = ptrA.UseCount = 2

share_ptr<A> ptrB = ptrA // 正确 此处隐式转换相等于share_ptr<A> ptrB(ptrA)ptrB.UseCount = 2

share_ptr<A> ptrB (new A())//逻辑错误,ptrB和ptrA没有关联,ptrB.UseCount = 1,ptrA.UseCount  = 1

函数调用:

ptrA.reset()//参数为空则表示ptrB不再管理对指针,ptrA.UseCount --,如果为 0,堆指针安全释放

ptrA.reset(new A())//重新管理,ptrA.UseCount ++

ptrA= nullptr // 相等于ptrA.reset()

ptrA.get()//获得原始指针

ptrA.swap(new B())//交换堆指针

weak_ptr作用:解决share_ptr的循环引用导致的不能析构问题,不增加引用计数,weak_ptr也是容器,托管对象是share_ptr对象

循环引用问题(伪代码):

class A{

share_ptr<B>pb;//B的share_ptr对象

}

class B{

share_ptr<A>pa;//A的share_ptr对象

}

函数体

{

share_ptr<A> ptrA(new A());//ptrA.usecount = 1

share_ptr<B> ptrB(new B());//ptrB.usecount = 1

ptrB.pa = ptrA;//ptrA.usecount  = ptrB.pa.usecount = 2

ptrA.pb = ptrB;//ptrB.usecount = 2

}

函数体结束后开始销毁栈对象,ptrB开始销毁,usecount =2,--usecount !=0,usecount  = 1,B堆内存不销毁

ptrA开始销毁,usecount =2,--usecount !=0,A堆内存不销毁

后续请看https://segmentfault.com/a/1190000016055581#articleHeader8

https://www.cnblogs.com/linuxAndMcu/p/10409723.html

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,160评论 1 51
  • 原作者:Babu_Abdulsalam 本文翻译自CodeProject,转载请注明出处。 引入### Ooops...
    卡巴拉的树阅读 30,286评论 13 74
  • C#、Java、python和go等语言中都有垃圾自动回收机制,在对象失去引用的时候自动回收,而且基本上没有指针的...
    StormZhu阅读 9,167评论 1 15
  • C++中struct和class的区别 ? 在C++中,可以用struct和class定义类,都可以继承。区别在于...
    匿名_22b4阅读 3,262评论 0 0
  • 月光,照亮屋顶,风,推开树林 一个印第安老人和少年 在丛林深处,相遇 篝火,老人敲起他的鼓,应声而歌 接受你身上所...
    寒羽正念阅读 3,777评论 0 0

友情链接更多精彩内容