Effective C++ 条款11
2016-02-21 11:25
405 查看
在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; };
相关文章推荐
- C++中的指针与引用
- 斐波那契数列
- 为什么要学习和使用C语言
- C语言中的enum(枚举)使用方法
- verilog与C语言的6点重大区别
- c语言入门之项目2.4——利用while求最大公约数
- OJ 系列之重复的电话号码(C_C++)
- C语言,词法分析的“贪心法”
- [转载] 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc),编写函数 strcpy(C++版)
- C++之路进阶——并查集(部落划分)
- C++ Primer引子
- C/C++指针与多维数组的关系
- 搭建C++开发开发环境
- 算法训练 王、后传说
- c++ lamdba表达式
- 20160208.CCPP体系详解(0018天)
- 20160208.CCPP体系详解(0018天)
- 20160208.CCPP体系详解(0018天)
- 经典C语言程序设计100例
- neuq oj 1050: 谭浩强C语言(第三版)习题6.6 C++