1、将指针封装成一个智能指针类,当其他类需要使用指针时,可用智能指针类代替,将智能指针类对象作为类成员;
2、智能指针类作为辅助类,包含了引用计数,当主类的对象进行复制、赋值时,智能指针类中引用计数会相应增加或减少,若计数为0时,
则对对象进行析构;计数不为0时,则不对智能指针类对象进行析构(智能指针类需要动态创建),这样,可以防止出现悬垂指针。
下面的代码有助于加强对智能指针的理解。
1 #include <iostream>
2
3
4 //定义仅由HasPtr类使用的U_Ptr类,用于封转使用计数和相关指针
5 class U_Ptr
6 {
7 friend class HasPtr;
8 int *ip; //相关指针
9 size_t use; //使用计数
10
11 U_Ptr(int *p):ip(p),use(1)
12 {
13 }
14 ~U_Ptr()
15 {
16 delete ip;
17 }
18 };
19
20 //定义HasPtr类
21 class HasPtr
22 {
23 public:
24 //构造函数:p是指向已经动态创建的int对象指针
25 HasPtr(int *p, int i):ptr(new U_Ptr(p)),val(i)
26 {}
27
28 //复制构造函数:复制成员并将使用计数加1
29 HasPtr(const HasPtr &orig)
30 :ptr(orig.ptr),val(orig.val)
31 {
32 ++ptr->use;
33 }
34 //赋值操作符
35 HasPtr & operator = (const HasPtr &);
36
37 //析构函数:如果使用计数为0,则删除U_Ptr对象
38 ~HasPtr()
39 {
40 if(--ptr->use == 0)
41 delete ptr;
42 }
43
44 //获取数据成员
45 int *get_ptr() const
46 {
47 return ptr->ip;
48 }
49 int get_int() const
50 {
51 return val;
52 }
53
54 //修改数据成员
55 void set_ptr(int *p)
56 {
57 ptr->ip = p;
58 }
59 void set_int(int i)
60 {
61 val = i;
62 }
63
64 //返回或修改基础int对象
65 int get_ptr_val() const
66 {
67 return *ptr->ip;
68 }
69 void set_ptr_val(int i)
70 {
71 *ptr->ip = i;
72 }
73
74 private:
75 U_Ptr *ptr;
76 int val;
77 };
78
79 HasPtr & HasPtr::operator=(const HasPtr &rhs)
80 {
81 //增加右操作数中的使用计数
82 ++rhs.ptr->use;
83
84 //将左操作数对象的使用计数减1,
85 //若该对象的使用计数减至0,则删除该对象
86 if(--this->ptr->use == 0)
87 delete ptr;
88
89 ptr = rhs.ptr; //复制U_Ptr指针
90 val = rhs.val; //复制int成员
91 return *this;
92 }
93
94 int main(int argc, char **argv)
95 {
96 int *p = new int(42);
97 HasPtr *obj = new HasPtr(p,10);
98
99 //HasPtr obj(p, 10);
100 HasPtr copy(*obj);
101
102 delete obj;
103
104 std::cout<<copy.get_ptr()<<std::endl;
105 std::cout<<copy.get_ptr_val()<<std::endl;
106
107 system("pause");
108 return 0;
109 }
参考:《C++ Primer》
原文链接: https://www.cnblogs.com/liu-jun/archive/2013/03/01/2939396.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/79178
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!