#include <iostream>
#include <memory>
class Foo
{
public:
Foo() {std::cout<<"Foo()\n";}
~Foo() {std::cout<<"~Foo()\n";}
};
class Bar : public Foo
{
public:
Bar() {std::cout<<"Bar()\n";}
~Bar() {std::cout<<"~Bar()\n";}
};
class Baz : public Bar
{
public:
Baz() {std::cout<<"Baz()\n";}
~Baz() {std::cout<<"~Baz()\n";}
};
int main()
{
std::cout<<"I am NOT using std::shared_ptr\n";
Foo* f = new Baz();
delete f;
std::cout<<"----------------------------------";
std::cout<<"\nI am USING std::shared_ptr\n";
Bar* b = new Baz();
std::shared_ptr<Foo> sp(b);
sp.reset();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgRm9vCnsKCXB1YmxpYzoKCQlGb28oKSB7c3RkOjpjb3V0PDwiRm9vKClcbiI7fQoJCX5Gb28oKSB7c3RkOjpjb3V0PDwifkZvbygpXG4iO30KfTsKCmNsYXNzIEJhciA6IHB1YmxpYyBGb28KewoJcHVibGljOgoJCUJhcigpIHtzdGQ6OmNvdXQ8PCJCYXIoKVxuIjt9CgkJfkJhcigpIHtzdGQ6OmNvdXQ8PCJ+QmFyKClcbiI7fQp9OwoKY2xhc3MgQmF6IDogcHVibGljIEJhcgp7CglwdWJsaWM6CgkJQmF6KCkge3N0ZDo6Y291dDw8IkJheigpXG4iO30KCQl+QmF6KCkge3N0ZDo6Y291dDw8In5CYXooKVxuIjt9Cn07CgppbnQgbWFpbigpCnsKCXN0ZDo6Y291dDw8IkkgYW0gTk9UIHVzaW5nIHN0ZDo6c2hhcmVkX3B0clxuIjsKCQoJRm9vKiBmID0gbmV3IEJheigpOwoJZGVsZXRlIGY7CgkKCQoJc3RkOjpjb3V0PDwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSI7CglzdGQ6OmNvdXQ8PCJcbkkgYW0gVVNJTkcgc3RkOjpzaGFyZWRfcHRyXG4iOwoJCglCYXIqIGIgPSBuZXcgQmF6KCk7CglzdGQ6OnNoYXJlZF9wdHI8Rm9vPiBzcChiKTsKCXNwLnJlc2V0KCk7Cn0=