博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective C++ 条款11
阅读量:6931 次
发布时间:2019-06-27

本文共 791 字,大约阅读时间需要 2 分钟。

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

转载地址:http://wgpjl.baihongyu.com/

你可能感兴趣的文章
jBPM 5 的点滴
查看>>
UVA 10400 Game Show Math
查看>>
Windows Phones 7 文件操作
查看>>
ubuntu命令安装java 6 jdk
查看>>
Android drawable
查看>>
android用户界面之AlarmManager教程实例汇
查看>>
BZOJ 2272 [Usaco2011 Feb]Cowlphabet
查看>>
CrossOver Linux 今日免费下载
查看>>
cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
查看>>
PL/SQL Function
查看>>
【Emacs】Emacs for windows安装【转载】
查看>>
AndroidManifest.xml文件详解(activity)(二)
查看>>
hdu 3251(最小割)
查看>>
优化Linux下的内核TCP参数以提高系统性能
查看>>
Jquery及Juqery Ajax学习小结
查看>>
设置JVM内存溢出时快照转存HeapDump到文件
查看>>
虚反矩阵指令pinv之应用
查看>>
php 上传文件代码
查看>>
java自定义获取星期几、几点、几分。
查看>>
how to Simply Singleton Navigate the deceptively simple Singleton pattern---reference
查看>>