Listing 8

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

struct S;
void delete_it(S *obj);

class S
  { // class with private destructor
  friend void delete_it(S*);
  ~S() { cout << "destructor\n"; }
  };

void delete_it(S *obj)
  { // destroy obj
  delete obj;
  }

int main()
  { // demonstrate use of deleter
  shared_ptr<S> sp(new S, &delete_it);
  if (get_deleter<void(*)(S*)>(sp))
    cout << "has deleter of type void(*)(S*)\n";
  else
    cout << "doesn't have deleter of type void(*)(S*)\n";
  return 0;
  }