1 // autoPtr.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include <iostream>
6 using namespace std;
7 class HasPtr
8 {
9 public:
10 HasPtr(int *p,int i):ptr(p),val(i)
11 {
12
13 }
14 int *get_ptr()const
15 {
16 return ptr;
17 }
18 int get_int()const
19 {
20 return val;
21 }
22 void set_ptr(int *p)
23 {
24 ptr = p;
25 }
26 void set_int(int i)
27 {
28 val = i;
29 }
30 int get_ptr_val()const
31 {
32 return *ptr;
33 }
34 void set_ptr_val(int val)const
35 {
36 *ptr = val;
37 }
38 private:
39 int *ptr;
40 int val;
41 };
42
43
44 int _tmain(int argc, _TCHAR* argv[])
45 {
46 int obj = 0;
47 //默认 复制 赋值 指针共享同一对象
48 HasPtr ptr1(&obj,42);
49 HasPtr ptr2(ptr1);
50 ptr1.set_int(0); //只改变ptr1中的val
51 cout<<ptr2.get_int()<<endl; //输出的仍然是42
52 cout<<ptr1.get_int()<<endl; //输出的是 0
53 ptr1.set_ptr_val(44); //设置了ptr1跟ptr2指针 同时指定的对象
54 cout<<ptr2.get_ptr_val()<<endl; //输出44
55 //出现悬指针
56 int *ip = new int(42); //动态分配 并初始化为42
57 HasPtr ptr(ip,10); //ptr 指针指跟 指针ip 指向同一 对象
58 delete ip;
59 ptr.set_ptr_val(12); //指针所指的对象都释放了....
60 cout<<ptr.get_ptr_val()<<endl; //仍然能输出???
61 return 0;
62 }
63
|
1 //保存指针和使用计数,每个HasPtr对象指向一个U_Ptr对象,使用计数将跟踪指向每个U_Ptr对象的HasPtr对象
2 class U_Ptr
3 {
4 //HasPtr 成员可以访问 U_Ptr成员
5 friend class HasPtrN;
6 int *ip;
7 size_t use;
8 U_Ptr(int *p):ip(p),use(1){}
9 ~U_Ptr(){delete ip;}
10 };
11
12 //新的HasPtr类
13 class HasPtrN
14 {
15 public:
16 HasPtrN(int *p,int i):ptr(new U_Ptr(p)),val(i){}
17 HasPtrN(const HasPtrN &orig):
18 ptr(orig.ptr),val(orig.val)
19 {
20 ++ptr->use;
21 }
22 HasPtrN& operator=(const HasPtrN&rhs)
23 {
24 ++rhs.ptr->use;
25 if (0 == --ptr->use)
26 {
27 delete ptr;
28 }
29 ptr = rhs.ptr;
30 val = rhs.val;
31 return *this;
32 }
33 ~HasPtrN()
34 {
35 if(0 == --ptr->use)
36 delete ptr;
37 }
38 int *get_ptr()const
39 {
40 return ptr->ip;
41 }
42 int get_int()const
43 {
44 return val;
45 }
46 void set_ptr(int *p)
47 {
48 ptr->ip = p;
49 }
50 void set_int(int i)
51 {
52 val = i;
53 }
54 int get_ptr_val()const
55 {
56 return *ptr->ip;
57 }
58 void set_ptr_val(int i)
59 {
60 *ptr->ip = i;
61 }
62 private:
63 U_Ptr *ptr;
64 int val;
65
66 };
1 class HasPtrValue
2 {
3 public:
4 HasPtrValue(const int &p,int i):ptr(new int(p)),val(i){}
5 HasPtrValue(const HasPtrValue &orig):
6 ptr(new int(*orig.ptr)),val(orig.val){}
7 HasPtrValue & operator = (const HasPtrValue&rhs)
8 {
9 *ptr = *rhs.ptr;
10 val = rhs.val;
11 return *this;
12 }
13 ~HasPtrValue(){}
14 int get_ptr_val()const
15 {
16 return *ptr;
17 }
18 int get_int()const
19 {
20 return val;
21 }
22 int *get_ptr()const
23 {
24 return ptr;
25 }
26 void set_ptr_val(int p)const
27 {
28 *ptr = p;
29 }
30 private:
31 int *ptr;
32 int val;
33
34 };