您的位置:首页 > 编程语言 > C语言/C++

c++智能指针详解

2015-01-03 13:35 459 查看
</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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: