#include #include template class SuperSmartPointer { public: explicit SuperSmartPointer(T* inPtr); ~SuperSmartPointer(); SuperSmartPointer(const SuperSmartPointer& src); SuperSmartPointer& operator=(const SuperSmartPointer& rhs); const T& operator*() const; const T* operator->() const; T& operator*(); T* operator->(); operator void*() const { return mPtr; } protected: T* mPtr; static std::map sRefCountMap; void finalizePointer(); void initPointer(T* inPtr); }; template std::mapSuperSmartPointer::sRefCountMap; template SuperSmartPointer::SuperSmartPointer(T* inPtr) { initPointer(inPtr); } template SuperSmartPointer::SuperSmartPointer(const SuperSmartPointer& src) { initPointer(src.mPtr); } template SuperSmartPointer& SuperSmartPointer::operator=(const SuperSmartPointer& rhs) { if (this == &rhs) { return (*this); } finalizePointer(); initPointer(rhs.mPtr); return (*this); } template SuperSmartPointer::~SuperSmartPointer() { finalizePointer(); } template void SuperSmartPointer::initPointer(T* inPtr) { mPtr = inPtr; if (sRefCountMap.find(mPtr) == sRefCountMap.end()) { sRefCountMap[mPtr] = 1; } else { sRefCountMap[mPtr]++; } } template void SuperSmartPointer::finalizePointer() { if (sRefCountMap.find(mPtr) == sRefCountMap.end()) { std::cerr << "ERROR: Missing entry in map!" << std::endl; return; } sRefCountMap[mPtr]--; if (sRefCountMap[mPtr] == 0) { // no No more references to this object -- delete it and remove from map sRefCountMap.erase(mPtr); delete mPtr; } } template const T* SuperSmartPointer::operator->() const { return (mPtr); } template const T& SuperSmartPointer::operator*() const { return (*mPtr); } template T* SuperSmartPointer::operator->() { return (mPtr); } template T& SuperSmartPointer::operator*() { return (*mPtr); } // Tests follow class Nothing { public: Nothing() { sNumAllocations++; } ~Nothing() { sNumDeletions++; } static int sNumAllocations; static int sNumDeletions; }; int Nothing::sNumAllocations = 0; int Nothing::sNumDeletions = 0; int main(int argc, char** argv) { Nothing* myNothing = new Nothing(); { SuperSmartPointer ptr1(myNothing); SuperSmartPointer ptr2(myNothing); } if (Nothing::sNumAllocations != Nothing::sNumDeletions) { std::cout << "TEST FAILED: " << Nothing::sNumAllocations << " allocations and " << Nothing::sNumDeletions << " deletions" << std::endl; } else { std::cout << "TEST PASSED" << std::endl; } }