boost的共享所有权share

xiaoxiao2025-11-17  7

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);//报错
转载请注明原文地址: https://www.6miu.com/read-5039779.html

最新回复(0)