1 #include<iostream>
2
3 using namespace std;
4
5 //命名空间
6 namespace smart_point
7 {
8 //智能指针计数类
9 class smart_count
10 {
11 public:
12 //构造函数
13 smart_count(int c=0):use_count(c)
14 {
15
16 }
17 ~smart_count()
18 {
19
20 }
21 //计数加一
22 int addref()
23 {
24 return ++use_count;
25 }
26 //计数减一
27 int release()
28 {
29 return --use_count;
30 }
31
32 private:
33 int use_count;
34
35 };
36
37
38 //智能指针
39 template <class T>
40 class smart_ptr
41 {
42 public:
43 //构造函数
44 smart_ptr(T*ptr=nullptr): p(ptr),u(new smart_count)
45 {
46
47 }
48 //构造函数
49 smart_ptr() :p(nullptr), u(nullptr)
50 {
51
52 }
53 //如果是引用其他指针则使用数量加一,不能被释放
54 smart_ptr(const smart_ptr<T> & s)
55 {
56 this->p = s.p;
57 this->u = s.u;//浅拷贝
58
59 if (u)
60 {
61 u->addref();//引用加1
62
63 }
64
65 }
66 //如果是等于其他指针则使用数量加一,不能被释放
67 void operator =(const smart_ptr<T> & s)
68 {
69 //如果被用=号赋值,则先判断能否被删除
70 //如果能销毁则销毁,然后赋值
71 if (p && u->release() <= 0)
72 {
73 delete p;
74 delete u;
75
76 }
77
78 this->p = s.p;
79 this->u = s.u;//浅拷贝
80
81 if (u)
82 {
83 u->addref();//引用加1
84
85 }
86 }
87 //取内容
88 T & operator * ()
89 {
90 return *p;
91 }
92 T operator ->()//具备指针的*,->
93 {
94 return p;
95 }
96 T * get()
97 {
98 return p;//获取内部指针
99 }
100 void rest(T *ptr)
101 {
102 if (p && u->release() <= 0)
103 {
104 delete p;
105 delete u;
106
107 }//销毁,赋值
108
109 p = ptr;
110 if (p)
111 {
112 u = new smart_count(1);
113 }
114 else
115 {
116 u = null;
117 }
118
119
120 }
121 void rest(const smart_ptr<T> & s)
122 {
123 if (p && u->release() <= 0)
124 {
125 delete p;
126 delete u;
127
128 }//销毁,赋值
129
130 p = s.p;
131 u = s.u;
132 if (u)
133 {
134 u->addref();
135 }
136
137
138
139 }
140 ~smart_ptr()
141 {
142 //注意析构。删除数据,引用
143 if (p && u->release() <= 0)
144 {
145 delete p;
146 delete u;
147 p = nullptr;//析构
148 }
149
150
151 }
152 //重载放在内部
153 template< class U>
154 inline bool operator ==( const smart_ptr<U> & t)
155 {
156 return (this->get() == t.get());
157 }
158 template< class U>
159 inline bool operator !=( const smart_ptr<U> & t)
160 {
161 return (this->get() != t.get());
162 }
163
164 private:
165 T *p;
166 smart_count *u;
167 };
168
169
170
171
172
173 }
174
175
176
177 void main()
178 {
179
180 while (1)
181 {
182 smart_point::smart_ptr<int> p(new int[1024 * 1024 * 100]);
183 }
184
185
186 cin.get();
187 }