#include <iostream>
#include <memory>
struct B;
struct A
{
void print() const { std::cout << "A " << std::endl; }
std::weak_ptr<B> pB;
};
struct B
{
void print() const { std::cout << "B " << std::endl; }
std::weak_ptr<A> pA;
};
int main()
{
auto a = std::make_shared<A>();
auto b = std::make_shared<B>();
a->pB = b;
b->pA = a;
a->print();
auto wb = a->pB.lock();
if (wb) { wb->print(); } else { std::cout << "nullptr\n"; }
a.reset();
auto wa = b->pA.lock();
if (wa) { wa->print(); } else { std::cout << "nullptr\n"; }
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IEI7CnN0cnVjdCBBCnsKICAgIHZvaWQgcHJpbnQoKSBjb25zdCB7IHN0ZDo6Y291dCA8PCAiQSAiIDw8IHN0ZDo6ZW5kbDsgfQogICAgc3RkOjp3ZWFrX3B0cjxCPiBwQjsKfTsKCnN0cnVjdCBCCnsKICAgIHZvaWQgcHJpbnQoKSBjb25zdCB7IHN0ZDo6Y291dCA8PCAiQiAiIDw8IHN0ZDo6ZW5kbDsgfQogICAgc3RkOjp3ZWFrX3B0cjxBPiBwQTsKfTsKCmludCBtYWluKCkKewogICAgYXV0byBhID0gc3RkOjptYWtlX3NoYXJlZDxBPigpOyAKICAgIGF1dG8gYiA9IHN0ZDo6bWFrZV9zaGFyZWQ8Qj4oKTsKCiAgICBhLT5wQiA9IGI7CiAgICBiLT5wQSA9IGE7CiAgICBhLT5wcmludCgpOwogICAgYXV0byB3YiA9IGEtPnBCLmxvY2soKTsKICAgIGlmICh3YikgeyB3Yi0+cHJpbnQoKTsgfSBlbHNlIHsgc3RkOjpjb3V0IDw8ICJudWxscHRyXG4iOyB9CgogICAgYS5yZXNldCgpOwoKICAgIGF1dG8gd2EgPSBiLT5wQS5sb2NrKCk7CiAgICBpZiAod2EpIHsgd2EtPnByaW50KCk7IH0gZWxzZSB7IHN0ZDo6Y291dCA8PCAibnVsbHB0clxuIjsgfQp9Cg==