实现指针引用计数的类 Reference Counter

使用一个指针指向一个动态对象,当不再使用的时候要销毁这个对象。如果会有多个指针指向同一个动态对象,那么需要知道,什么时候才能销毁这个对象。提前销毁对象可能导致指针指向并且销毁一个不存在的对象,不销毁则会是内存泄露。因此,有必要为指针设计一个引用计数机制,这个机制封装在一个类中。其实这就是一种智能指针。

http://blog.csdn.net/ojshilu/article/details/19353451


下面是一个数组类的实现,其中对数组内容实现的是浅拷贝方式,但采用引用计数。拷贝或赋值得到的对象将会使得引用计数发生变化。当计数器为0即没有指针指向该数组的生活,才会销毁数组内容。

template<typename T> class Array
{
	private:
		//count和data都用指针类型,对象共享一套
		unsigned int *count;
		T *data;
		// 内部的对象清理函数
		void Release()
		{
			(*count)--;
			if(*count == 0)
			{
				if(data)
				{
					delete data;
					data = NULL;
				}
				delete count;
				count = NULL;
			}
		}
	public:
		// 构造函数:计数初始为1
		Array(unsigned int size)
		{
			*count = 1;
			if(size > 0)
				data = new T;
		}

		// 拷贝构造函数:计数加1
		Array(const Array& copy):data(copy.data), count(copy.count)
		{
			(*count)++:
		}

		//析构函数
		~Array()
		{
			Release();
		}

		//赋值运算符重载
		const Array& operator=(const Array& copy)
		{
			// 自身赋值检查
			if(data == copy.data)
				return *this;
			Release;
			data = copy.data;
			count = copy.count;
			(*count)++;
			return *this;
		}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值