// 智能指针
// 作用:
// 1. 管理堆内存
// 使用约束:
// 1. 不能将栈对象取地址后赋值给智能指针
// 2. 每一个对应的堆对象地址只能赋值给一个智能指针对象
#pragma once
template<class T>
class CSmartPoint
{
unsigned int* piCount;
T* p;
public:
CSmartPoint()
{
piCount = new unsigned int(0);
p = NULL;
}
~CSmartPoint()
{
(*piCount)--;
if (p && (*piCount) == 0)
{
delete piCount;
piCount = NULL;
delete p;
p = NULL;
}
}
CSmartPoint(T* pt)
{
piCount = new unsigned int(1);
if (p)
{
this->~CSmartPoint();
}
p = pt;
}
CSmartPoint(const CSmartPoint& sp)
{
piCount = sp.piCount;
(*piCount)++;
p = sp.p;
}
T* get()
{
return p;
}
unsigned int count()
{
return *piCount;
}
CSmartPoint& operator=(T* pt)
{
if (p == pt)
{
return *this;
}
if (p)
{
this->~CSmartPoint();
}
p = pt;
return *this;
}
CSmartPoint& operator=(CSmartPoint& sp)
{
if (p == sp.p)
{
return *this;
}
if (p)
{
this->~CSmartPoint();
}
piCount = sp.piCount;
(*piCount)++;
p = sp.p;
return *this;
}
T* operator->()
{
return p;
}
};