shared_ptr增加父引用

shared_ptr increase parent reference

本文关键字:引用 增加 ptr shared      更新时间:2023-10-16

伪代码:

typedef shared_ptr<B> ptr_child;
typedef shared_ptr<A> ptr_parent ;
class A
{
public:
    A()
    {
        child = ptr_child(new B);
    }
    ptr_child getB()
    {
        return child;
    }
private:
    ptr_child child;
};

我想用shared_ptr来管理A和B的指针,B是A的孩子。当对孩子有强烈的参考时,父母A不能被摧毁。

问题是当 B 引用增加时,如何增加父项 A 的引用计数。

B可以将shared_ptr<A>作为其父级作为成员,但 is 将创建一个引用循环,使得两个引用计数都不会减少到 0。要打破循环,请使用 weak_ptr .

我已经解决了这个问题,代码如下:

#include <memory>
class B;
class A;
typedef std::shared_ptr<A> a_ptr;
typedef std::shared_ptr<B> b_ptr;
class B
{
public:
    B(A* prt):parent(prt){}
private:    
    A* parent;
};
class A : public std::enable_shared_from_this<A>
{
public:
    A(){}
    b_ptr getChild()
    {
        b_ptr pb = b_ptr(this->shared_from_this(), child);
        return pb;
    }
    static a_ptr getA()
    {
        a_ptr pa = a_ptr(new A);
        pa->child = new B(pa.get());
        return pa;
    }
private:
    B* child;
};
int wmain(int argc, wchar_t* argv[])
{
    a_ptr a = A::getA();
    printf("a ref %dn", a.use_count());
    b_ptr b1 = a->getChild();
    printf("a ref %d, b1 ref %d, n", a.use_count(), b1.use_count());
    b_ptr b2 = a->getChild();
    printf("a ref %d, b1 ref %d, n", a.use_count(), b1.use_count());
    b_ptr b3 = b2;
    printf("a ref %d, b1 ref %d, n", a.use_count(), b1.use_count());
    //A and B are share reference, when no reference to A, but have reference to B, A will not be destroyed.
    return 0;
}

输出:

a ref 1
a ref 2, b1 ref 2,
a ref 3, b1 ref 3,
a ref 4, b1 ref 4,