#include <iostream>
#include <memory>
using namespace std;
int main()
{
struct Parent;
struct Child
{
shared_ptr<Parent> ptr;
Child(shared_ptr<Parent> a) :
ptr(a)
{}
};
struct Parent : public enable_shared_from_this<Parent>
{
Child myChild;
Parent() :
myChild(shared_ptr<Parent>(this))
{}
shared_ptr<Parent> getptr()
{
return shared_from_this();
}
};
shared_ptr<Parent> p(new Parent);
cout << "UC of parent: " << p.use_count() << endl;
cout << "UC of child ptr: " << p->myChild.ptr.use_count() << endl;
shared_ptr<Parent> p2(p);
cout << "UC of parent: " << p2.use_count() << endl;
cout << "UC of child ptr: " << p2->myChild.ptr.use_count() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oKQp7CglzdHJ1Y3QgUGFyZW50OwoJc3RydWN0IENoaWxkCgl7CgkJc2hhcmVkX3B0cjxQYXJlbnQ+IHB0cjsKCQkKCQlDaGlsZChzaGFyZWRfcHRyPFBhcmVudD4gYSkgOgoJCQlwdHIoYSkKCQl7fQoJfTsKCQoJc3RydWN0IFBhcmVudCA6IHB1YmxpYyBlbmFibGVfc2hhcmVkX2Zyb21fdGhpczxQYXJlbnQ+Cgl7CgkJQ2hpbGQgbXlDaGlsZDsKCQkKCQlQYXJlbnQoKSA6IAoJCQlteUNoaWxkKHNoYXJlZF9wdHI8UGFyZW50Pih0aGlzKSkKCQl7fQoJCQoJCQoJCXNoYXJlZF9wdHI8UGFyZW50PiBnZXRwdHIoKQoJCXsKCQkJcmV0dXJuIHNoYXJlZF9mcm9tX3RoaXMoKTsKCQl9Cgl9OwoJCgkKCXNoYXJlZF9wdHI8UGFyZW50PiBwKG5ldyBQYXJlbnQpOwoJY291dCA8PCAiVUMgb2YgcGFyZW50OiAiIDw8IHAudXNlX2NvdW50KCkgPDwgZW5kbDsKCWNvdXQgPDwgIlVDIG9mIGNoaWxkIHB0cjogIiA8PCBwLT5teUNoaWxkLnB0ci51c2VfY291bnQoKSA8PCBlbmRsOwoJCglzaGFyZWRfcHRyPFBhcmVudD4gcDIocCk7Cgljb3V0IDw8ICJVQyBvZiBwYXJlbnQ6ICIgPDwgcDIudXNlX2NvdW50KCkgPDwgZW5kbDsKCWNvdXQgPDwgIlVDIG9mIGNoaWxkIHB0cjogIiA8PCBwMi0+bXlDaGlsZC5wdHIudXNlX2NvdW50KCkgPDwgZW5kbDsKCQoJcmV0dXJuIDA7Cn0=