Цикл с weak_ptr без утечки в C++
Слабая связь в одну сторону разрывает цикл двух объектов и дает им освободить память.
Слабая связь в одном направлении
разрывает замыкание: weak_ptr
наблюдает за соседом, но не продлевает
его жизнь. Запишем две структуры, свяжем
их и выведем сообщения из деструкторов
при выходе из main:
#include <iostream>
#include <memory>
struct SideB;
struct SideA {
std::shared_ptr<SideB> peer;
~SideA() {
std::cout << "A gone\n";
}
};
struct SideB {
std::weak_ptr<SideA> back;
~SideB() {
std::cout << "B gone\n";
}
};
int main() {
auto a = std::make_shared<SideA>();
auto b = std::make_shared<SideB>();
a->peer = b;
b->back = a;
return 0;
}
Сделайте struct Host с
shared_ptr<Guest> и
struct Guest с weak_ptr<Host>.
Свяжите два make_shared-объекта
и добавьте деструкторы с разными словами.
Убедитесь, что оба срабатывают при завершении
программы.