其实大体思路就是引用计数器嘛

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) {}
//构造函数count,必须new出来
SharedPtr(T* p):count(new int(1)),ptr(p){}
//拷贝构造函数,使其引用计数+1
SharedPtr(SharedPtr<T>& other):count(&(++*other.count)),ptr(other.ptr){}
T* operator->() { return ptr; }
T& operator*() { return *ptr; }

//重载operator =
//如果原来的sharedptr已经有对象,则让其引用对象次数减一并判断引用是否为0
//(是否调用delete),然后将新的引用对象次数加一
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;
}
}
//析构函数 使用引用次数减一并判断引用是否为零,即是否调用delete
~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;
}