问这样的智能指针线程安全吗

飞翔的薄荷 2012-09-07 01:41:28

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


...全文
130 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧