c++智能指针详解

</pre>指针在c++中可以说用的相当广泛,但是在管理指针的时候会经常出现一些问题,比如有两个指针同时指向一个对象,而开发者在开发过程中可能会忘了同时有两个指针指向这个对象,于是使用其中一个指针删除该对象,因此会造成另外一个指针指向空对象,导致该指针为悬垂指针。<p></p><p>为了解决这个问题,c++中有两种方法,第一种引入了一种叫智能指针的概念,原理很简单,就是把指向该对象的指针交给一个类进行管理,说白了就是使用一个计数器,当没有指针指向该对象时,计数器为0,当有一个指针指向该对象时,计数器为1,以此类推,当有n个指针指向该对象时,计数器为n,每当增加一个指针指向该指针,计数器就增加1。相反,如果减少一个指针指向该对象,计数器就减1,直到计数器为0时,说明没有指针指向该对象了,这时就可以将该对象删除了。</p><p>第二种是叫做值拷贝,就是在有另外一个指针要指向这个对象的时候,将该对象进行拷贝,因此两个指针相互不影响。</p><p>本文只对第一种进行介绍,如果需要了解第二种的同学,请查阅其他资料。</p><p>原理介绍完了,下面是实现代码:</p><p></p><pre name="code" class="html">#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";
    
    return 0;
}
//使用计数类
class U_Ptr{
public:
    friend class HasPtr;
    int *ip;
    size_t use;
    U_Ptr(int *p):ip(p),use(1){}
    ~U_Ptr(){delete ip;}
};
class HasPtr{
public:

//    HasPtr(int *p,int i):ptr(p),val(i){}
//    int *get_ptr()const {return ptr;}
//    int get_int()const{return val;}
//    
//    void set_ptr(int *p){ptr=p;}
//    void set_int(int i){val=i;}
//    
//    int get_ptr_val()const{return *ptr;}
//    void set_ptr_val(int val)const{*ptr = val;}
    //smart point
    HasPtr(int *p,int i):ptr(new U_Ptr(p)),val(i){}
    HasPtr(const HasPtr &orig):val(orig.val),ptr(orig.ptr){++ptr->use;}
    HasPtr& operator=(const HasPtr&);
    ~HasPtr(){if(--ptr->use==0)delete ptr;}
    int *get_ptr()const{return ptr->ip;}
    int get_int()const {return val;}
    void set_ptr(int *p){ptr->ip=p;}
    void set_int(int i){val=i;}
    int get_ptr_val()const {return *ptr->ip;}
    void set_ptr_val(int i){*ptr->ip=i;}
    
private:
    U_Ptr *ptr;
    int val;
};
HasPtr& HasPtr::operator=(const HasPtr &rhs){
    ++ptr->use; //如果有赋值操作,先将计数器加1
    if(--ptr->use==0)
        delete ptr;
    ptr=rhs.ptr;
    val=rhs.val;
    return *this;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值