Вопрос про std::shared_ptr
От: wayfaring  
Дата: 09.09.13 13:53
Оценка:
Здравствуйте. Подскажите почему не работает следующий код:

#include <memory>
#include <iostream>

class B;

class A {
public:
    A()
    {
        std::cout << "A::A()" << std::endl;
    }

    ~A()
    {
        std::cout << "A::~A()" << std::endl;
    }

    std::shared_ptr< B > m_b;
};

class B {
public:
    B()
    {
        std::cout << "B::B()" << std::endl;
    }

    ~B()
    {
        std::cout << "B::~B()" << std::endl;
    }

    std::shared_ptr< A > m_a;
};

void main()
{
    std::shared_ptr< A > a( new A );
    std::shared_ptr< B > b( new B );

    a->m_b = b;
    b->m_a = a;

    std::cout << "A use count: " << a.use_count() << std::endl;
    std::cout << "B use count: " << b.use_count() << std::endl;

    a = nullptr;
    b = nullptr;

    std::cout << "A use count: " << a.use_count() << std::endl;
    std::cout << "B use count: " << b.use_count() << std::endl;
}


Вывод следующий:

A::A()
B::B()
A use count: 2
B use count: 2
A use count: 1
B use count: 1
Re: Expected vs. Actual
От: Qbit86 Кипр
Дата: 09.09.13 13:59
Оценка:
Здравствуйте, wayfaring, Вы писали:

W>Подскажите почему не работает следующий код:

W>Вывод следующий:

Код работает. Ты, наверное, имел в виду: «Почему фактический результат выполнения не совпадает с ожидаемым?» Тогда ты должен дополнитльно сформулировать, каков для тебя ожидаемый результат. (Это касается не только этого вопроса, а в принципе любого вопроса или багрепорта.)
Глаза у меня добрые, но рубашка — смирительная!
Re: Вопрос про std::shared_ptr
От: ArtDenis Россия  
Дата: 09.09.13 14:01
Оценка:
Здравствуйте, wayfaring, Вы писали:

...
W>A use count: 1
W>B use count: 1

Так всё правильно же. use count = 1, т.к. ссылка на объект осталась в умном указателе в поле класса.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: Expected vs. Actual
От: wayfaring  
Дата: 09.09.13 14:02
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Код работает. Ты, наверное, имел в виду: «Почему фактический результат выполнения не совпадает с ожидаемым?» Тогда ты должен дополнитльно сформулировать, каков для тебя ожидаемый результат. (Это касается не только этого вопроса, а в принципе любого вопроса или багрепорта.)


Да, извините за не совсем корректно сформулированный вопрос.

Я понимаю почему не освобождаются ресурсы, но вот каким образом правильно связать два класса A и B?

Так вопрос будет звучать правильнее...

Спасибо.
Re[2]: Вопрос про std::shared_ptr
От: wayfaring  
Дата: 09.09.13 14:03
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>...

W>>A use count: 1
W>>B use count: 1

AD>Так всё правильно же. use count = 1, т.к. ссылка на объект осталась в умном указателе в поле класса.


Да, все правильно, но как сделать, чтобы освобождались ресурсы при выходе?

Т.е., чтобы в выводе еще было и:

A::~A()
B::~B()
Re[3]: Вопрос про std::shared_ptr
От: ArtDenis Россия  
Дата: 09.09.13 14:06
Оценка: 1 (1)
Здравствуйте, wayfaring, Вы писали:
W>Да, все правильно, но как сделать, чтобы освобождались ресурсы при выходе?

weak_ptr тебе в руки (в полях класса вместо shared_ptr). Он как раз сделан для того, чтобы не создавать циклические ссылки, которые у тебя в данном коде получились.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[4]: Вопрос про std::shared_ptr
От: ArtDenis Россия  
Дата: 09.09.13 14:20
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Он как раз сделан для того, чтобы не создавать циклические ссылки, которые у тебя в данном коде получились.


Точнее сказать разруливать циклические ссылки
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.