Как избежать утечки памяти с shared_ptr? - PullRequest
20 голосов
/ 01 декабря 2009

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

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

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

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

1 Ответ

49 голосов
/ 01 декабря 2009

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

С shared_ptr введение :

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

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

...