1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include<iostream> #include<string>
using namespace std;
template <typename T> class SharedPtr { public: SharedPtr() :count(0), ptr((T*)0) {} SharedPtr(T* p):count(new int(1)),ptr(p){} SharedPtr(SharedPtr<T>& other):count(&(++*other.count)),ptr(other.ptr){} T* operator->() { return ptr; } T& operator*() { return *ptr; }
SharedPtr<T>& operator = (SharedPtr<T>& other) { if (this == &other) return *this; ++* other.count; if (this->ptr && 0 == -- * this->count) { delete count; delete ptr; cout << "delete ptr = " << endl; this->ptr = other.ptr; this->count = other.count; return *this; } } ~SharedPtr() { if (ptr && -- * count == 0) { delete count; delete ptr; cout << "delete ptr ~" << endl; } } int getRef() { return *count; }
private: int* count; T* ptr; };
int main() { SharedPtr<string> pstr(new string("abc"));
cout << "pstr:" << pstr.getRef() << " " << *pstr << endl;
SharedPtr<string> pstr2 (pstr); cout << "pstr:" << pstr.getRef() << " " << *pstr << endl; cout << "pstr2:" << pstr2.getRef() << " " << *pstr2 << endl;
SharedPtr<string> pstr3(new string("hao")); cout << "pstr3:" << pstr3.getRef() << " " << *pstr3 << endl;
pstr3 = pstr2; cout << "pstr:" << pstr.getRef() << " " << *pstr << endl; cout << "pstr2:" << pstr2.getRef() << " " << *pstr2 << endl; cout << "pstr3:" << pstr3.getRef() << " " << *pstr3 << endl;
cin.get(); cin.get();
return 0; }
|