#include <iostream>
#include <algorithm>
#include <memory>
struct Node;
typedef std::shared_ptr<Node> NodePtr;
struct Node
{
int value;
NodePtr next;
Node(int arg) : value(arg) {}
~Node() { std::cout << "Deleting " << value << '\n'; }
};
int main()
{
// simple list population
NodePtr head;
NodePtr* p = &head;
for (int i=1; i<=20; ++i)
{
p->reset(new Node(i));
p = &(*p)->next;
}
// leaving now would be BAD.
// proper cleanup. note that after the head reassignment
// only one outstanding shared pointer references the
// former head: victim. Two still reference the new list
// front: head and victim->next, and the latter will be
// released as soon as the while-scope exits and victim
// is deleted.
while (head)
{
NodePtr victim = head;
head = head->next;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IE5vZGU7CnR5cGVkZWYgc3RkOjpzaGFyZWRfcHRyPE5vZGU+IE5vZGVQdHI7CgpzdHJ1Y3QgTm9kZQp7CiAgICBpbnQgdmFsdWU7CiAgICBOb2RlUHRyIG5leHQ7CiAgICBOb2RlKGludCBhcmcpIDogdmFsdWUoYXJnKSB7fQogICAgfk5vZGUoKSB7IHN0ZDo6Y291dCA8PCAiRGVsZXRpbmcgIiA8PCB2YWx1ZSA8PCAnXG4nOyB9Cn07CgppbnQgbWFpbigpCnsKICAgIC8vIHNpbXBsZSBsaXN0IHBvcHVsYXRpb24KICAgIE5vZGVQdHIgaGVhZDsKICAgIE5vZGVQdHIqIHAgPSAmaGVhZDsKICAgIGZvciAoaW50IGk9MTsgaTw9MjA7ICsraSkKICAgIHsKICAgICAgICBwLT5yZXNldChuZXcgTm9kZShpKSk7CiAgICAgICAgcCA9ICYoKnApLT5uZXh0OwogICAgfQogICAgCiAgICAvLyBsZWF2aW5nIG5vdyB3b3VsZCBiZSBCQUQuCiAgICAKICAgIC8vIHByb3BlciBjbGVhbnVwLiBub3RlIHRoYXQgYWZ0ZXIgdGhlIGhlYWQgcmVhc3NpZ25tZW50CiAgICAvLyAgb25seSBvbmUgb3V0c3RhbmRpbmcgc2hhcmVkIHBvaW50ZXIgcmVmZXJlbmNlcyB0aGUKICAgIC8vICBmb3JtZXIgaGVhZDogdmljdGltLiBUd28gc3RpbGwgcmVmZXJlbmNlIHRoZSBuZXcgbGlzdAogICAgLy8gIGZyb250OiBoZWFkIGFuZCB2aWN0aW0tPm5leHQsIGFuZCB0aGUgbGF0dGVyIHdpbGwgYmUKICAgIC8vICByZWxlYXNlZCBhcyBzb29uIGFzIHRoZSB3aGlsZS1zY29wZSBleGl0cyBhbmQgdmljdGltCiAgICAvLyAgaXMgZGVsZXRlZC4KICAgIHdoaWxlIChoZWFkKQogICAgewogICAgICAgIE5vZGVQdHIgdmljdGltID0gaGVhZDsKICAgICAgICBoZWFkID0gaGVhZC0+bmV4dDsKICAgIH0KfQ==