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);//报错