UtilPtr


The UtilPtr class provides a way for automating memory management. UtilPtr is basically a reference-counting pointer. A UtilPtr<T> is created from a T* and initally has a reference count of 1. As the UtilPtr is copied into other UtilPtrs, the reference count in incremented, and as the UtilPtrs go out of scope, the reference count is decremented. When the last UtilPtr that points to an object is destroyed, then the object pointed to is deleted. The important thing to remember is not to create more than one UtilPtr<T> from the same T*. Instead, create one UtilPtr and then copy it into the others. Because if you use the same T* to create more than one UtilPtr<T>, then the object will get deleted more than once, which is a very bad thing.

template <class T>
class UtilPtr {
public:
  UtilPtr();
  UtilPtr(T*);
  UtilPtr(const UtilPtr<T>&);
  ~UtilPtr();
  UtilPtr<T>& operator=(const UtilPtr<T>&);
  UtilPtr<T>& operator=(T*);
  bool operator==(const UtilPtr<T>&) const;
  bool operator==(T*) const;
  T* operator->() const;
  T& operator*() const;
  operator T*() const;
};

UtilPtr()
This contructor creates a null UtilPtr.
UtilPtr(T* x)
This constructor creates a UtilPtr that points to the same object as x. Note that it is a bad idea to use x once use have created a UtilPtr from it, since x is not a reference counting pointer, and the object it points to will be deleted once all of the UtilPtrs that point to the object have gone out of scope, so then x will be pointing into thin air. For the same reason, you should never create more than one UtilPtr directly from x.
UtilPtr(const UtilPtr<T>& x)
This constructor creates a UtilPtr which points to the same object as x. Note that using this constructor, or using operator= are the only only acceptable ways to copy a UtilPtr. (Note that passing a UtilPtr as an argument is okay, since it implicitly uses this constructor.) It is not okay to convert a UtilPtr<T> into a T* and then construct another UtilPtr<T> from that T*.
~UtilPtr()
The destructor for UtilPtr decrements the reference count of the object, and also deletes the object if the reference count goes to zero.
UtilPtr<T>& operator=(const UtilPtr<T>& x)
This operator allows assigning a UtilPtr to point to the object which another UtilPtr points to. The reference counts of the objects involved are automatically adjusted.
UtilPtr<T>& operator=(T* x)
Like the above operator, but makes the UtilPtr point to the object which the T* points to. Note that all the same cautions that apply to the T* constructor also apply here.
bool operator==(const UtilPtr<T>& x)
Compares two UtilPtrs.
bool operator==(T* x)
Compares a UtilPtr<T> with a T*.
T* operator->()
This works just like you would expect operator-> to work with a regular pointer.
T& operator*()
This works just like you would expect operator* to work with a regular pointer.
operator T*()
This conversion operator allows converting a UtilPtr<T> into a T*. Note that the T* may not be valid after the UtilPtr<T> goes out of scope.

Modified 21 October 1995 pepellet@mit.edu