64,642
社区成员
发帖
与我相关
我的任务
分享
template <class T>
class U_Ptr
{
private:
T *m_pPtr;
size_t m_nUser;
public:
U_Ptr(T *pPtr):m_nUser(1),m_pPtr(pPtr)
{
}
~U_Ptr()
{
printf("删除内存\r\n");
delete m_pPtr;
}
public:
inline void AddUser()
{
//加上锁
++m_nUser;
//解锁
}
inline int DelUser()
{
//加上锁
--m_nUser;
//解锁
return m_nUser;
}
};
template <class T>
class HasPtr
{
public:
HasPtr(T *pPtr)
{
m_pPtr = new U_Ptr<T>(pPtr);
printf("生成一个 m_pPtr\r\n");
}
HasPtr(const HasPtr& orig) : m_pPtr(orig.m_pPtr)
{
m_pPtr->AddUser();
}
~HasPtr()
{
if (0 == m_pPtr->DelUser())
{
delete m_pPtr;
printf("删除一个 m_pPtr\r\n");
}
}
// 获取数据成员
inline int *GetPtr() const
{
return m_pPtr->m_pPtr;
}
private:
U_Ptr<T> *m_pPtr;
public:
HasPtr& operator = (const HasPtr &rhs)
{
if (this == &rhs)
{
return *this;
}
rhs.m_pPtr->AddUser();
if (0 == m_pPtr->DelUser())
{
delete m_pPtr;
m_pPtr = NULL;
printf("删除一个 m_pPtr\r\n");
}
m_pPtr = rhs.m_pPtr; // 复制U_Ptr指针
return *this;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
HasPtr<int> *pPtr = NULL;
int *p = new int;
pPtr = new HasPtr<int>(p);
delete pPtr;
getchar();
return 0;
}