Подтвердить что ты не робот

Как избежать утечки памяти с помощью shared_ptr?

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

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;
}

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

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

4b9b3361

Ответ 1

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

Из shared_ptr введение:

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

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