псевдокод:
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 является дочерним. И когда у них есть сильная ссылка на ребенка, родитель А не может быть уничтожен.
Вопрос заключается в том, как увеличить счетчик ссылок родительского А, когда значение B было увеличено.
Я решил проблему, код следующим образом:
#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 %d\n", 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,
B
может содержать shared_ptr<A>
для своего родителя как члена, хотя он создаст ссылочный цикл, так что ни число ссылок не уменьшится до 0. Чтобы разбить цикл, используйте weak_ptr
.
parent
иchild
(child
может иметьchild
) управляются с помощью shared_ptr. Кто-то может содержать ссылку наchild
, и егоparent
был уничтожен. Моя проблема, когда есть ссылка наchild
,parent
не должен быть уничтожен.