//文件开始
#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;
}