template<class T> class Handle {
public:
    Handle(): use(new int(1)), p(0) { }
    Handle(T* tp): use(new int(1)), p(tp) { }
    Handle(const Handle& h): use(h.use), p(h.p) { ++*use; }
    Handle& operator=(const Handle& h) {
	++*h.use;
	if (--*use == 0) {
	    delete use;
	    delete p;
	}
	p = h.p;
	use = h.use;
	return *this;
    }
    T* operator->() const {
	return p;
    }
    T& operator*() const {
	return *p;
    }
    ~Handle() {
	if (--*use == 0) {
	    delete use;
	    delete p;
	}
    }

private:
    T* p;
    int* use;
};


