C++ :引用计数(reference count) 实现

17 篇文章 0 订阅

referecen count 的核心思维:使用一个计数器来标识当前指针指向的对象被多少类的对象所使用(即记录指针指向对象被引用的次数)

  • 构造函数中创建类的新对象时,初始化引用计数为1;
  • 拷贝构造函数复制指针,并使相应的引用计数增加1;
  • 赋值操作减少左操作数所值对象的引用计数,增加右操作数所指对象的引用计数;
  • 析构函数使引用计数减少1,并且当引用计数为1时,释放指针说指向的对象;

使用引用计数实现智能指针的关键是,引用计数应该存在哪里

引用计数应该是某个类对象和其复制对象共享的, 而指针成员恰好有这样的特性, 故可以在类中多声明一个int * 的成员,用来表示引用计数

代码实现:

#include<iostream>
#include<string>

using namespace std;

class Referenced
{
public:
	//首先初始化这个类,引用计数置为一,并且将地址赋给p
	Referenced(int *pi)
	{
		refCount = 1;
		p = pi;
	}
	//计数器+1
	int ref()
	{
		return ++refCount;
	}
	//计数器-1
	int unref()
	{
		return --refCount;
	}
	//返回引用计数
	int count()
	{
		return refCount;
	}
	//析构函数:释放内存
	Referenced()
	{
		cout << "delete referenced" << endl;
		delete p;
	}
private:
	int refCount;//计数器:表示有多少个变量引用这块内存
	int *p;      //实际指针
};
//对指针进行管理的类,有一个Referenced类的指针ptr
//根据指针中的引用计数来判断是否调用delete来删除指针ptr
class Ref_ptr
{
public:
	//使用int *指针初始化ptr,必须要放在初始化列表中
	Ref_ptr(int *i) :ptr(new Referenced(i))
	{
	}
	//拷贝构造函数,另一个指针变量指向这块区域
	Ref_ptr(const Ref_ptr& rhs)
	{
		ptr = rhs.ptr;//将右操作数的引用计数对象赋值给左操作数
		ptr->ref();   //将其引用计数+1
	}
	//赋值操作,右操作数的引用计数+1,左操作数的引用计数要-1
	Ref_ptr& operator=(const Ref_ptr& rhs)
	{
		//自己给自己赋值直接返回
		if (&rhs == this)
		{
			return *this;
		}
		//赋值操作符,首先给当前类的引用计数减一
		if (ptr->unref() == 0)
		{
			cout << "delete Ref_ptr " << endl;
			delete ptr;
		}
		//将右操作数的引用计数赋值给当前的对象
		ptr = rhs.ptr;
		//引用计数加一
		ptr->ref();
		return *this;
	}
	//析构函数,引用计数减为0,删除这快内存
	~Ref_ptr()
	{
		if (ptr->unref() == 0)
		{
			cout << "delete Ref_ptr" << endl;
			delete ptr;
		}
	}
private:
	Referenced * ptr;
};

道理我都懂,代码没头绪,这是参考(抄袭)的原博客:https://blog.csdn.net/u012501459/article/details/48229399

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C++中,可以使用std::count函数来计算一个向量(vector)中特定元素的数量。引用展示了一个使用std::count函数的例子,其中strVec是一个字符串向量,target是要查找的目标元素。该函数返回元素值为target的元素个数。如果计数结果大于0,则表示目标元素存在于向量中。 而在Java中,并没有直接的vector count函数。但是可以使用其他方法来实现类似的功能。比如可以使用List的contains方法来检查元素是否存在,并且可以使用Collections类的frequency方法来计算元素在列表中出现的次数。这些方法提供了类似于C++中std::count函数的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ std::vector count统计某个元素个数 是否存在某个值](https://blog.csdn.net/u013288190/article/details/120686563)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【C++STL】vector的count()和count_if()函数的用法](https://blog.csdn.net/m0_38033475/article/details/79561369)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [超详细Java入门到精通自学视频课程-08、继承:概述、案例.rar](https://download.csdn.net/download/weixin_54787054/88280693)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值