// This may look like C code, but it is really -*- C++ -*- #ifndef RCPTR_H #define RCPTR_H // This implements a very simple "smart pointer" with reference counting. // Many refinements are possible // - const propagation // ... // Principle : use RCPtr instead of T* // To use with type X, define // typedef RCPtr Xp; // When creating a new object, use // Xp xp = new X(...); // xp can be used like a X* xp->field, xp->method(), *xp ... // can be passed by reference, copied, etc // the object is destroyed when the last Xp is destroyed. template class RCPtr { public: RCPtr(T* obj=0) { x = obj; cnt = new int; *cnt = 1; } RCPtr(RCPtr const& other) { x = other.x; cnt = other.cnt; (*cnt)++; } RCPtr& operator = (RCPtr const& other) { (*cnt)--; if (!*cnt) { delete x; delete cnt; } x = other.x; cnt = other.cnt; (*cnt)++; return *this; } ~RCPtr() { (*cnt)--; if (!*cnt) { delete x; delete cnt; } } T* operator->() {return x;} T& operator*() {return *x;} private: T* x; // the object we are referring int* cnt; // how many smart pointers ? }; #endif