关于智能指针中实现赋值运算符的问题

whdugh 2014-04-10 09:34:28
在实现智能指针赋值运算符时,为了防止自身赋值有下面一段代码
HasPtr &HasPtr::operator=(const HasPtr &rhs) ///注意,这里赋值操作符在减少做操作数的使用计数之前使rhs的使用技术加1,从而防止自我赋值
{
///增加右操作数中的使用计数
++rhs.ptr->use;
///将左操作数对象的使用计数减1,若该对象的使用计数减至0,则删除该对象
if(--ptr->use == 0) delete ptr;
ptr = rhs.ptr; ///复制U_Ptr指针
val = rhs.val; ///复制int成员
return *this;
}


怎么理解这段代码啊?1、为什么要这样防止自身赋值,想不明白?比如下图,
2、比如有赋值语句p2=p1;是不是应该先将p2的资源释放掉,然后将p1的值赋给p2?
赋值结果如下图:

这样是正确的吗?赋值后不是1个对象指向u_ptr吗?
3、如果有自身赋值,出出现什么情况,如下图:

是不是p1的资源被释放后,在重新赋值后会用到被释放的资源,导致错误,是不是可以这样理解,
谢谢了
...全文
145 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2014-04-10
  • 打赏
  • 举报
回复
你的代码已经处理了自我赋值的情况,一切okay。
cc___999 2014-04-10
  • 打赏
  • 举报
回复
就是如果有智能指针p,然后有p = p;如果不先
///增加右操作数中的使用计数
    ++rhs.ptr->use;
就会执行
if(--ptr->use == 0) delete ptr;
就把自己给删掉了,

64,639

社区成员

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

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