对象引用 计数 原理

#include<iostream>
using namespace std;
/*
   主要思想,CPtrInt相当于管理int*的智能指针,能控制复制中内存悬挂等问题。
   该对象内部有一个CPtrCount类,该类负责记录拷贝的次数,保存共享内存的指针。
   该类的拷贝构造负责,拷贝复制其数据 引用次数 共享内存指针。不负责处理引用次数的计算。当该对象
   析构后,删除共享内存的空间。
   CPtrInt智能指针负责控制复制时候 引用次数,根据引用次数判断引用类是不是该删除 

*/
class CPtrInt;
//计数器负责拷贝实际的共享内存地址。当计数器释放的时候释放共享内存 
class CPtrCount
{
    private:
        int* piData;
        int iUse;
        friend class CPtrInt;
    public:
        CPtrCount(int* piScrData):piData(piScrData)
        {
            iUse = 1; 
        }  
        CPtrCount(CPtrCount& copy)
        {
            piData = copy.piData;
            iUse = copy.iUse;
        }       
        ~CPtrCount()
        {
            if(piData != NULL)
            {
                delete piData;
            }    
        } 
         
    public://共享内存的操作函数
         void Print()
         {
             cout<<*piData<<endl;
         }   
         void SetInt(int iNum)
         {
             *piData = iNum;
         }        
};  
//所有的CPtrInt的引用计数器的对象在内存中共享,指向同一个地方。
//因此能计数。如果不共享计数器,不能做到统一管理 
class CPtrInt//这个类只控制计数器的复制,计数器控制,管理,空间释放,不管理具体共享的内存 
{
    private:
        CPtrCount* m_ptrCount;
    public:
        CPtrInt(int* pInt):m_ptrCount(new CPtrCount(pInt)){      }
        CPtrInt(CPtrInt &obj):m_ptrCount(obj.m_ptrCount)//引用计数器对象指向相同空间。计数器+1 相当于大家计数器都加1 
        {
            m_ptrCount->iUse++; 
        }
        ~CPtrInt()
        {
            if(--m_ptrCount->iUse==0)
            {
                cout<<"iuse=0 delete the share memory"<<endl; 
            }     
            else
            {
                cout<<"just the object of CPtrClass dead. the iuse = "<<m_ptrCount->iUse<<endl; 
            }    
        } 
        CPtrInt& operator = (CPtrInt &obj)
        {
            obj.m_ptrCount->iUse++; //copy 了一次 右值
            if(--m_ptrCount->iUse == 0) //左边的引用次数剪1
            {
                delete m_ptrCount; 
             } 
             m_ptrCount = obj.m_ptrCount; 
             return *this;//别忘了
        }    
    public://重载->可以直接操作PtrCount类里面共享内存的相关操作
         CPtrCount* operator ->()
         {
             return m_ptrCount; 
         }          
};    

int main()
{
    {
     CPtrInt p1(new int(10));
     {
        p1->Print();
        CPtrInt p2(p1);
        p2->SetInt(2); 
        p1 = p2;
        CPtrInt p3(p2);
        p3->Print();
     }
    }        
    system("pause");
    return 0;
}        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值