Effective C++ 条款11

Effective C++ 条款11

大家好,又见面了,我是全栈君。

在operator=中处理“自我赋值”

什么是自我赋值,非常明显。

就是自己的值赋值给了自己。以下的代码就是自我赋值:

class Widget
{
public:
    Widget& operator=(const Widget& rhs)
    {
        delete p;
        p=new int(ths.p);
        return *this;
    }
    int *p;
};

Widget w1,w2;
w1=w2;
w1=w1;//自我赋值。

如上代码,自我赋值的时候会出现删除自身数据的操作,这样非常危急。由于p变成了野指针。

为了防止以上错误能够进行“自我測试”,假设发现是自我赋值就直接返回。

例如以下代码:

class Widget
{
public:
    Widget& operator=(const Widget& rhs)
    {
        if(this==&rhs)//自我測试
            return *this;
        delete p;
        p=new int(rhs.p);
        return *this;
    }
    int *p;
};

可是。以上代码有还有一个缺陷,就是一旦new一个新空间失败,p还是会变成野指针。
所以,能够先保存原来的数据,等new成功之后在进行数据替换;
再次改动代码例如以下:

class Widget
{
public:
    Widget& operator=(const Widget& rhs)
    {
        int tmp=p;//记录原先内存
        p=new int(rhs.p);
        delete tmp;//释放原先内存
        return *this;
    }
    int *p;
};

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115960.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • EasyUI学习笔记

    EasyUI学习笔记

    2021年7月11日
    82
  • Android自定义ProgressDialog

    Android自定义ProgressDialog我们在开发Android上应用程序时,有很多时候会遇到“延时”等待的情况,例如数据加载时,尤其是在联网的时候,请求网络会有个等待时间,在这个等待的时间里需要给用户一个友好的提示,提示用户现在正在做什么操作,需要耐心等待等等,这时一个进度对话框就可以解决。Android提供给我们一个很好的控件叫ProgressDialog,用来创建自定义信息以及一些相关操作,唯一不好的一点就是Android原生控件给我一种一如既往的单调和丑陋,下面是原生ProgressDialog的源码以及效果

    2022年7月14日
    20
  • 数独挑战之九宫格入门第一题解题思路

    数独挑战之九宫格入门第一题解题思路

    2021年7月3日
    195
  • 激光SLAM原理_激光打标机

    激光SLAM原理_激光打标机在机器人运动控制系统架构中,可分为最底层、中间通信层和决策层三大层面,最底层包含了机器人本身的电机驱动和控制部分,中间通信层是底层部分和决策层的通信通路,而决策层则是实现机器人的定位建图及导航。在机器人定位导航中,目前主要涉及到激光SLAM与视觉SLAM,激光SLAM在理论、技术和产品落地上都较为成熟,因而成为现下最为主流的定位导航方式,在家用扫地机器人及商用送餐机器人等服务机器人中普遍采用了…

    2022年8月23日
    2
  • linux卸载socat,socat在Linux下的使用「建议收藏」

    目录0x01socat介绍0x02socat进行文件传输0x03socat正向端口转发0x04socat反向端口转发注:边界机器Ubuntu192.168.222.177内网机器win7192.168.222.1370x01socat介绍socat我们在前面也已经介绍过了,之前说的是Windows下的利用,如果没有看到的朋友请移步【socat在Windows下的使用】,socat…

    2022年4月10日
    158
  • 基础野:细说无符号整数[通俗易懂]

    基础野:细说无符号整数[通俗易懂]Brief本来只打算理解JS中0.1+0.2==0.30000000000000004的原因,但发现自己对计算机的数字表示和运算十分陌生,于是只好恶补一下。本篇我们一起来探讨一下基础的基础

    2022年8月3日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号