c++实现引用计数

概述

当有指针指向同一块内存空间时,计数器加1,没增加一个指向该内存空间的指针,计数器加1,同理,当原本指向该内存空间的指针指向另一块内存,计数器减1,被指向的另一个内存的计数器加1。下面是一个引用计数的一种实现。

示例

直接上代码,总共分为三部分,第一部分是基本类的定义,第二部分是对于基本类的使用类,第三部分是实现真正的引用计数功能。

// ReferenceCount.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 
#include 

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<<"引用计数的个数:"<getCount()<
    //SmartPtr s2(s1);
    //cout<<"引用计数的个数:"<getCount()<
    //SmartPtr s3 = s2;
    //cout<<"引用计数的个数:"<getCount()<
    testReference();

    system("pause");
	return 0;
}

以上代码是在vs2010上实现的,创建的环境是控制台程序,自动生成的项目结构如下:
c++实现引用计数_第1张图片
以上仅供参考。

你可能感兴趣的:(C++,c++,引用计数)