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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值