Как избежать утечки памяти с помощью 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;
}
Нет вывода. Нет дескриптора. Утечка памяти.
Я всегда считал, что умный указатель помогает избежать утечек памяти.
Что делать, если мне нужны перекрестные ссылки в классах?
Ответы
Ответ 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
для "прерывания циклов".
Спасибо, Глен, за ссылку.