Listing 6

#include <memory>
#include <iostream>
using std::tr1::shared_ptr;
using std::cout;

class base
  { // base type with protected destructor
protected:
  virtual ~base() { cout << "base destructor\n"; }
  };

class derived : public base
  { // derived type with public destructor
public:
  ~derived() { cout << "derived destructor\n"; }
  };

int main()
  { // resource deleted through constructor argument type
  shared_ptr<base> sp(new derived);
        // okay: derived::~derived accessible
  shared_ptr<base> sp((base*)new derived);
        // error: base::~base not accessible
  return 0;
  }