CSmartPtr
Smart pointers can be used to automatically free an object when nobody points at it anymore. Things contained in smart pointers must implement AddRef and Release functions. If those functions are private, then the class must make CRefCountAccessor a friend.