c++ primer智能指针简单实现

来源:互联网 发布:淘宝客服子账号认证 编辑:程序博客网 时间:2024/06/05 23:02
//文件开始
#include <iostream>#include <string>using namespace std;class U_Ptr//智能指针{U_Ptr( int * p ): ip ( p ),  use( 1 ){}int *ip;size_t use;friend class HasPtr;~U_Ptr() { delete ip; }};class HasPtr{public:HasPtr( int *p, int i ): ptr( new U_Ptr( p ) ), val( i ){}HasPtr( const HasPtr & orig ): ptr( orig.ptr ) , val ( orig.val ){cout<<"调用复制构造函数" <<endl;++ptr->use;}HasPtr & operator = ( const HasPtr & );~HasPtr() {cout<<"调用析构函数" <<endl;if( --ptr->use == 0 )delete ptr;}private:U_Ptr *ptr;//通过复制构造生成的对象公用这个指针值,这就是智能指针的作用吧, 把通过相同方式得到的对象绑定在一起,//这样子就不会出现不同对象指向野指针的问题了,因为当其中一个对象析构以后,共同指针还在,所以其他对象还可以正确调用//该指针值int val;};HasPtr &HasPtr ::operator = ( const HasPtr & rhs ){cout<<"调用赋值运算符重载" <<endl;++rhs.ptr->use;//这么做可以防止自身复制 if( --ptr->use == 0 )delete ptr;ptr = rhs.ptr;val = rhs.val;return  *this;//返回对左操作数的引用}int main(){int *p = new int ( 20 );cout<<"----------------1" <<endl;HasPtr Ha( new int ( 20 ), 20 );//经过网友的解答,这样的构造形式才是智能指针的真正用法cout<<"----------------2" <<endl;HasPtr Hb( Ha );cout<<"----------------3" <<endl;HasPtr Hc = Ha;delete p;/*这里出了问题,要是去掉就没事了,可是明明应该加上的呀??为什么呢因为int *p = new int ( 20 ); 过后,在智能指针类中定义了构造函数U_Ptr( int * p ): ip ( p ),  use( 1 ){}和析构函数 ~U_Ptr() { delete ip; },在智能指针类中我们没有另外分配空间,调用析构函数后,ip和p的地址被释放,如果我们重复释放同一块地址两次当然会出现异常。*/return 0;}

原创粉丝点击