Как избежать утечки памяти с помощьюshared_ptr?
-
11-09-2019 - |
Вопрос
Рассмотрим следующий код.
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
экземпляры не будут восстановлены.Например, еслиmain()
держитshared_ptr
кA
, что прямо или косвенно содержитshared_ptr
вернуться кA
,A
счетчик использования будет 2.Уничтожение оригиналаshared_ptr
покинетA
висит со счетом использования 1.Использоватьweak_ptr
«разорвать циклы».
Спасибо, Глен, за ссылку.
Не связан с StackOverflow