关于boost 库 shared_ptr 智能指针的循环引用【2013.10.22】

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 


1.Boost库是个什么样的库,程序员都有自己的判断,本人用的比较少,多一点是了解。呵呵

shared_ptr是个使用率很高的东西,基本可以替代指针的使用,而且能保证其安全性。

唯独有一种情况,shared_ptr确是那么无能为力,那就是产生循环引用的时候,看代码说明一切:


class B;

class A

{

.........

shared_pre<B> m_pBInA;

}


class A;

class B

{

..........

shared_ptr<A > m_pAInB;

}


int main()

{

shared_ptr<A> a (new A); //此处A的引用为1

shared_ptr<B> b ( new B);//同理 B的引用为1

a->m_pBInA = b;//赋值 B引用+1

b->m_pAInB = a;//同理 A引用+1 = 2

}  // a b 作用域结束,引用 - 1 剩余的还是1 那么shared_ptr的内存无法释放,产生内存泄漏。。。。。。

这里虽然只说了两个类的引用包含,但是不论是几个类,只要其中shared_ptr的引用产生环,就会发生以上的情况。

有点类似数据库中的死锁,各自等待对方释放对方.....

解决办法是有的, 只要避免 环的产生 ,那就不会出现这样的情况了。 如果不想使用普通指针,那可以使用Boost的weak_ptr这个弱引用智能指针代替其中一个shared_ptr,代码修改如下:

class A

{

..........

weak_ptr<B> m_pBInA;

}

class B //依旧不变

酱紫就可以了。。。。。


另外还有几点关于shared_ptr使用的注意事项:

1.不要把普通指针交给多个shared_ptr管理。代码如:

int *pint = new int[3];

shared_ptr<int > p1(pint);

shared_ptr<int > p2(pint); 

因为shared_ptr会自动释放指针,多个的话会导致指针被多次释放,这是不可能的。so。。。你懂得。修改方法是,之后的定义复制不用普通指针,而用管理其的shared_ptr

shared_ptr<int > p2(p1);//这样是可以安全使用的。

2.不能在函数实参中定义shared_ptr,如下:

func(shared_ptr<int > (new int),func2());

修改为:

shared_ptr<int> pint(new int);

func(pint,func2);

3.不要把this指针赋值给shared_ptr,如下代码:

class AS

{

shared_ptr<AS> getP()

{

return shared_ptr<AS> (this);

}

}


AS as;

shared_ptr<AS> pTmp = as.getP();//  as可能会被释放两次哦。。。有点类似低一点。呵呵....当然可爱的Boost也提供了解决方法,可以将AS继承于enable_shared_from_this,修改如下:

class AS :public enable_shared_from_this<this> //其他不变;。。




欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 


你可能感兴趣的:(C++,指针,内存管理,内存泄漏,boost)