欢迎加入我们的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