Effective C++ 条款11
来源:互联网 发布:裤子 知乎 编辑:程序博客网 时间:2024/05/16 17:59
在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;};
1 1
- Effective C++:条款01
- Effective C++:条款02
- Effective C++:条款03
- Effective C++:条款04
- Effective C++:条款05
- Effective C++:条款06
- Effective C++:条款07
- Effective C++:条款08
- 《effective C++》条款三
- 《effective C++》条款5
- 《effective C++》条款六
- Effective C++--经验条款
- Effective C ++ 条款34
- 《Effective C++》条款05
- 《Effective C++》条款06
- 《Effective C++》条款08
- Effective C++——条款10条,条款11和条款12(第2章)
- 《Effective C++》资源管理:条款13-条款15
- C++引用的用法
- 基于Android的拍照上传程序开发
- POJ 3311 Hie with the Pie
- spring-控制事物回滚
- 计算机视觉目标检测的框架与过程
- Effective C++ 条款11
- 浅析人脸检测之Haar分类器方法
- openlayer vectorlayer不显示
- 目标检测的图像特征提取之(一)Haar特征
- 关于H5实现的手机摇一摇
- MFC 不同进程间的消息通信与数据(字符串)发送
- 目标检测的图像特征提取之(二)LBP特征
- 数据结构学习之二叉树(面试易考题整理)
- 目标检测的图像特征提取之(三)HOG特征