#include <cstdio>
#include <memory>
#define KNOTE(fmt, args...) ::printf(fmt "\n", ##args)
class CyclicB;
class CyclicA {
public:
~CyclicA() {
KNOTE("%s", __func__);
}
std::shared_ptr<CyclicB> b;
};
class CyclicB {
public:
~CyclicB() {
KNOTE("%s", __func__);
}
std::shared_ptr<CyclicA> a;
};
class FixCyclicB;
class FixCyclicA {
public:
~FixCyclicA() {
KNOTE("%s", __func__);
}
std::shared_ptr<FixCyclicB> b;
};
class FixCyclicB {
public:
~FixCyclicB() {
KNOTE("%s", __func__);
}
std::weak_ptr<FixCyclicA> a;
};
void TestSharedPtrCyclicRef()
{
std::shared_ptr<CyclicA> a(new CyclicA);
std::shared_ptr<CyclicB> b(new CyclicB);
a->b = b;
b->a = a;
} // Not a nor b is deleted
void TestWeakPtrFixCyclicRef()
{
std::shared_ptr<FixCyclicA> a(new FixCyclicA);
std::shared_ptr<FixCyclicB> b(new FixCyclicB);
a->b = b;
b->a = a;
}
int main()
{
KNOTE("\nTestSharedPtrCyclicRef");
TestSharedPtrCyclicRef();
KNOTE("\nTestWeakPtrFixCyclicRef");
TestWeakPtrFixCyclicRef();
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPG1lbW9yeT4KCiNkZWZpbmUgS05PVEUoZm10LCBhcmdzLi4uKSA6OnByaW50ZihmbXQgIlxuIiwgIyNhcmdzKQoKY2xhc3MgQ3ljbGljQjsKCmNsYXNzIEN5Y2xpY0EgewpwdWJsaWM6CiAgfkN5Y2xpY0EoKSB7CiAgICBLTk9URSgiJXMiLCBfX2Z1bmNfXyk7CiAgfQogIHN0ZDo6c2hhcmVkX3B0cjxDeWNsaWNCPiBiOwp9OwoKY2xhc3MgQ3ljbGljQiB7CnB1YmxpYzoKICB+Q3ljbGljQigpIHsKICAgIEtOT1RFKCIlcyIsIF9fZnVuY19fKTsKICB9CiAgc3RkOjpzaGFyZWRfcHRyPEN5Y2xpY0E+IGE7Cn07CgpjbGFzcyBGaXhDeWNsaWNCOwpjbGFzcyBGaXhDeWNsaWNBIHsKcHVibGljOgogIH5GaXhDeWNsaWNBKCkgewogICAgS05PVEUoIiVzIiwgX19mdW5jX18pOwogIH0KICBzdGQ6OnNoYXJlZF9wdHI8Rml4Q3ljbGljQj4gYjsKfTsKCmNsYXNzIEZpeEN5Y2xpY0IgewpwdWJsaWM6CiAgfkZpeEN5Y2xpY0IoKSB7CiAgICBLTk9URSgiJXMiLCBfX2Z1bmNfXyk7CiAgfQogIHN0ZDo6d2Vha19wdHI8Rml4Q3ljbGljQT4gYTsKfTsKCgp2b2lkIFRlc3RTaGFyZWRQdHJDeWNsaWNSZWYoKQp7CiAgc3RkOjpzaGFyZWRfcHRyPEN5Y2xpY0E+IGEobmV3IEN5Y2xpY0EpOwogIHN0ZDo6c2hhcmVkX3B0cjxDeWNsaWNCPiBiKG5ldyBDeWNsaWNCKTsKCiAgYS0+YiA9IGI7CiAgYi0+YSA9IGE7Cn0gLy8gTm90IGEgbm9yIGIgaXMgZGVsZXRlZAoKdm9pZCBUZXN0V2Vha1B0ckZpeEN5Y2xpY1JlZigpCnsKICBzdGQ6OnNoYXJlZF9wdHI8Rml4Q3ljbGljQT4gYShuZXcgRml4Q3ljbGljQSk7CiAgc3RkOjpzaGFyZWRfcHRyPEZpeEN5Y2xpY0I+IGIobmV3IEZpeEN5Y2xpY0IpOwoKICBhLT5iID0gYjsKICBiLT5hID0gYTsKfQoKaW50IG1haW4oKQp7CktOT1RFKCJcblRlc3RTaGFyZWRQdHJDeWNsaWNSZWYiKTsKVGVzdFNoYXJlZFB0ckN5Y2xpY1JlZigpOwpLTk9URSgiXG5UZXN0V2Vha1B0ckZpeEN5Y2xpY1JlZiIpOwpUZXN0V2Vha1B0ckZpeEN5Y2xpY1JlZigpOwpyZXR1cm4gMDsKfQ==