Вопрос

Рассмотрим следующий код.

using boost::shared_ptr;
struct B;
struct A{
    ~A() { std::cout << "~A" << std::endl; }
    shared_ptr<B> b;    
};
struct B {
    ~B() { std::cout << "~B" << std::endl; }
    shared_ptr<A> a;
};

int main() {
    shared_ptr<A> a (new A);
    shared_ptr<B> b (new B);
    a->b = b;
    b->a = a;

    return 0;
}

Есть нет вывода. Нет деструктора называется.Утечка памяти.Я всегда считал, что умный указатель помогает избежать утечек памяти.

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

Это было полезно?

Решение

Если у вас есть подобные циклические ссылки, один объект должен содержать weak_ptr другому, а не shared_ptr.

От тот shared_ptr введение:

Поскольку реализация использует подсчет ссылок, циклы shared_ptr экземпляры не будут восстановлены.Например, если main() держит shared_ptr к A, что прямо или косвенно содержит shared_ptr вернуться к A, Aсчетчик использования будет 2.Уничтожение оригинала shared_ptr покинет A висит со счетом использования 1.Использовать weak_ptr «разорвать циклы».

Спасибо, Глен, за ссылку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top