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