这里的赋值操作符比较麻烦,且让我用图表分析一番:
假设现在又两个智能指针p1、 p2,一个指向内容为42的内存,一个指向内容为100的内存,如下图:
现在,我要做赋值操作,p2 = p1。对比着上面的
HasPtr& operator=(const HasPtr&); // 赋值操作符
此时,rhs就是p1,首先将p1指向的ptr的use加1,
++rhs.ptr->use; // 增加右操作数中的使用计数
然后,做:
if (--ptr->use == 0)
delete ptr;
因为,原先p2指向的对象现在p2不在指向,那么该对象就少了一个指针去指,所以,use做自减1;
此时,条件成立。因为u2的use为1。那么,运行U_Ptr的析构函数,而在U_Ptr的析构函数中,做了delete ip操作,所以释放了内存,不会有内存泄露的问题。
接下来的操作很自然,无需多言:
ptr = rhs.ptr; // 复制U_Ptr指针
val = rhs.val; // 复制int成员
return *this;