#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();
}