#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;
}