c++智能指针循环引用带来的问题及解决方案
先看段代码,如下:
class B;
class A
{
public:
~A()
{
m_bp.reset();
}
boost::shared_ptr<B> m_pb;
}
class B
{
public:
~B()
{
m_pa.reset();
}
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的use_count都为2.
假如,pa在程序某次执行了pa.reset(),此时pa所指向对象的use_count为1,因此没有执行A的析构函数,所以pb指向对象的use_count没有变化,依然为2;接着pb在程序的某次也执行了pb.reset(),此时所指向对象的use_count为1,最终pa和pb所指向的对象资源都没被释放掉,造成内存泄漏
解决的方案,可以将A、B任何一个类的成员变量由shared_ptr类型更改为weak_ptr类型,或声明为简单的对象指针(A *m_pa/B *m_pb)