shared_ptr увеличить родительскую ссылку

0

псевдокод:

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 было увеличено.

  • 0
    Пожалуйста, приведите конкретный пример, иллюстрирующий проблему.
  • 0
    parent и child ( child может иметь child ) управляются с помощью shared_ptr. Кто-то может содержать ссылку на child , и его parent был уничтожен. Моя проблема, когда есть ссылка на child , parent не должен быть уничтожен.
Показать ещё 1 комментарий
Теги:
shared-ptr

2 ответа

0
Лучший ответ

Я решил проблему, код следующим образом:

#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,
0

B может содержать shared_ptr<A> для своего родителя как члена, хотя он создаст ссылочный цикл, так что ни число ссылок не уменьшится до 0. Чтобы разбить цикл, используйте weak_ptr.

  • 0
    Если B содержит слабый_птр своего родителя А, когда сильная ссылка на А равна 0 (уничтожена), а сильная ссылка на счетчик В не равен 0, родительский слабый_птр Б истекает. Моя цель - когда сильная ссылка B> 0, A не может быть уничтожена.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню