boost的共享所有权share_ptr指针

1:share_ptr指针相当于所有股东放弃股权,公司才会转让;scoped_ptr相当于一个人拥有公司,他放弃股权,公司也就转让出去了;

2:shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的指向相同的内存,每次拷贝,引用计数加一;

3:实例:使用方法和std的智能指针是一样的

#include <boost/make_shared.hpp>
class A{
	A();
	~A();
};
int main(){
	boost::shared_ptr<A> a;//引用计数逐渐加一,三个智能指针指向同一地址,自动释放,不用手动析构
	boost::shared_ptr<A> b;
	boost::shared_ptr<A> c;
	//手动分离管理权
	a.reset();//引用计数减一
}

4:share_ptr的使用陷阱
1)不能引用栈内存,scoped_ptr也一样

int a=10;//局部变量
boost::shared_ptr<int> p1(&a);
//因为智能指针释放一次,栈内存被系统释放一次,因此会报错;编译通过,运行出错;

2)不能多次引用同一原始指针,否则同一内存会被delete多次;

int *pInt =new int(0);
boost::shared_ptr<pInt> p1(pInt );//不会出错
boost::shared_ptr<pInt> p2(pInt );//出错

boost::shared_ptr<pInt> p2(p1 );//这种没问题

3)循环引用,导致内存泄漏

class A{
public:
A(){}
~A(){}
boost::shared_ptr<B> m_pb;
};


 class B{
    public:
    B(){}
    ~B(){}
    boost::shared_ptr<A> m_pa;
    
    };
    boost::shared_ptr<A> pa(new A);
    boost::shared_ptr<B> pb(new B);
    
    pa->m_pb=pb;
    pb->m_pa=pa;
    //此操作会出错,pa,pb在析构时,引用计数都只减一,因此会导致内存泄漏

4)shared_ptr使用的是delete来删除内存,因此要注意内存是否是刚new出来的

int *pInt = (int*)malloc(sizeof(int));
boost::shared_ptr<pInt> p(pInt);//编译可以通过,不报错,但是有问题,
A *a=(*A)malloc(sizof(A));
boost::shared_ptr<A> p(A);//报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值