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

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

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

初始化:

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

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

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

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

share_ptr 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_ptrpb;//B的share_ptr对象

}

class B{

share_ptrpa;//A的share_ptr对象

}

函数体

{

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

share_ptr 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

你可能感兴趣的:(c++系列:智能指针share_ptr,unique_ptr,weak_ptr)