概述
当有指针指向同一块内存空间时,计数器加1,没增加一个指向该内存空间的指针,计数器加1,同理,当原本指向该内存空间的指针指向另一块内存,计数器减1,被指向的另一个内存的计数器加1。下面是一个引用计数的一种实现。
示例
直接上代码,总共分为三部分,第一部分是基本类的定义,第二部分是对于基本类的使用类,第三部分是实现真正的引用计数功能。
// ReferenceCount.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
//基础对象类
class MyPoint
{
public:
MyPoint(int a = 0,int b = 0):x(a),y(b)
{
}
void setPoint(int a,int b){x = a;y = b;}
int getX() const {return x;}
int getY()const {return y;}
private:
int x;
int y;
};
//辅助类(共享资源,含有计数和共享的数据资源)
class SharePoint
{
friend class SmartPtr;//友元函数可以访问类中的私有成员变量
SharePoint(MyPoint *p):ptr(p),count(0){}
~SharePoint()
{
if(count == 0)
{
delete ptr;
}
}
MyPoint *ptr;//共享的数据资源
int count;//计数
public:
int getCount()const{return count;}
};
//智能指针类
class SmartPtr
{
public:
SmartPtr(MyPoint *p):ptr(new SharePoint(p))
{
++ptr->count;
}
SmartPtr(const SmartPtr &p)//拷贝构造函数
{
ptr = p.ptr;
++ptr->count;
}
SmartPtr & operator=(const SmartPtr &p)//赋值运算符重载
{
if(this->ptr != p.ptr)
{
if(--ptr->count == 0)//原来指向的内存空间的计数减1
{
delete ptr;
}
this->ptr = p.ptr;
++p.ptr->count;//新指向的内存空间的计数增加1
}
return *this;
}
SharePoint &operator*()
{
return *ptr;
}
SharePoint * operator->()
{
return ptr;
}
~SmartPtr()
{
if(ptr->count == 0)
{
delete ptr;
}
else
{
--ptr->count;
}
cout<<"引用计数:"<<ptr->count<<endl;
}
SharePoint *getSourcePtr(){return ptr;}
private:
SharePoint *ptr;
};
//测试引用计数,可以看出引用计数的计数增加于减少
void testReference()
{
MyPoint p(1,2);
SmartPtr s1(&p);
cout<<"引用计数的个数:"<<s1.getSourcePtr()->getCount()<<endl;
{
SmartPtr s2(s1);
cout<<"引用计数的个数:"<<s1.getSourcePtr()->getCount()<<endl;
{
SmartPtr s3 = s2;
cout<<"引用计数的个数:"<<s1.getSourcePtr()->getCount()<<endl;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//以下只能增加引用计数
//MyPoint p(1,2);
//SmartPtr s1(&p);
//cout<<"引用计数的个数:"<<s1.getSourcePtr()->getCount()<<endl;
//SmartPtr s2(s1);
//cout<<"引用计数的个数:"<<s1.getSourcePtr()->getCount()<<endl;
//SmartPtr s3 = s2;
//cout<<"引用计数的个数:"<<s1.getSourcePtr()->getCount()<<endl;
testReference();
system("pause");
return 0;
}
以上代码是在vs2010上实现的,创建的环境是控制台程序,自动生成的项目结构如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/543b0fda845c4ea699e348ece29e47b9.png)
以上仅供参考。