概述
当有指针指向同一块内存空间时,计数器加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上实现的,创建的环境是控制台程序,自动生成的项目结构如下:
以上仅供参考。