#include <iostream>
#include <memory>

struct Node {
    int value;
    std::shared_ptr<Node> child;
    std::weak_ptr<Node> parent;
    explicit Node(int initial) : value{initial} {}
    ~Node() {
        std::cout << "destroy " << value << '\n';
    }
};

int main() {
    std::weak_ptr<Node> parent_watch{};
    std::weak_ptr<Node> child_watch{};
    {
        auto parent = std::make_shared<Node>(1);
        auto child = std::make_shared<Node>(2);
        parent->child = child;
        child->parent = parent;
        parent_watch = parent;
        child_watch = child;
        std::cout << "linked " << parent->value << ' ' << parent->child->value << '\n';
    }
    std::cout << "expired " << parent_watch.expired() << ' ' << child_watch.expired() << '\n';
    return 0;
}
