1、将指针封装成一个智能指针类,当其他类需要使用指针时,可用智能指针类代替,将智能指针类对象作为类成员;
2、智能指针类作为辅助类,包含了引用计数,当主类的对象进行复制、赋值时,智能指针类中引用计数会相应增加或减少,若计数为0时,
则对对象进行析构;计数不为0时,则不对智能指针类对象进行析构(智能指针类需要动态创建),这样,可以防止出现悬垂指针。
下面的代码有助于加强对智能指针的理解。
1 #include2 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< <
参考:《C++ Primer》