博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在operator =中要处理“自我赋值”
阅读量:6905 次
发布时间:2019-06-27

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

 

防止自我赋值很有必要

Widget w;w = w;a[i] = a[j]; //a[i]和a[j]实际上指向同一个元素*pi = *pj; //pi和pj实际上指向同一个元素

自我赋值的危害

Widget{private:    Test *p;};Widget &Widget::operator=(const Widget &w){  delete p;  p = new int (*w.p);  return *this;}

如果是自我赋值,会把自己的空间释放掉,即当执行delete p后,w.p已经指向一个被释放的内存空间(此时*w.p的内容未知);当执行 p = new int(*w.p);即让p重新指向一个存储了(*w.p)的内存空间,该内存空间内容又是未知的。当再次引用时,会出现未定义的行为。

改良版本

Widget &Widget::operator=(const Widget &w){  if (this == &w)  {      return *this;  }  delete p;  p = new Test(*w.p);  return *this;};

这个类虽然能避免自我赋值的问题,但是,如果new Test时抛出异常,那么Widget最终会持有一个指针指向一块被删除的内存区域,这样的指针是有害的。

改成这样

Widget &Widget::operator=(const Widget &rhs){  Test *porg = p;  p = new Test(*rhs.p);  delete porg;  return *this;}

此时new Test发生异常,那么p可以保持原状。(异常发生的时候,不会给p赋值)

delete prog;保证了p原来指向的内存空间也会被顺利释放。

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

你可能感兴趣的文章
nullnullhow to read directory name using std c in the linux
查看>>
开源请求程序员的黄金时代
查看>>
合同设备SQL树形数据的一种解决方法
查看>>
jquary 选择器大全
查看>>
iOS开发复选框类库SSCheckBoxView
查看>>
动态链接库、静态库、import库区别
查看>>
android的消息处理机制(图+源码分析)——Looper,Handler,Message
查看>>
My Apple Developer Library Catalog
查看>>
[置顶] 王志成30岁前自传-我曾创造过的“第一”
查看>>
Java中Runnable和Thread的区别
查看>>
Java中数组Arrays.binarySearch,快速查找数组内元素位置
查看>>
Fastjson是一个Java语言编写的高性能功能完善的JSON库。
查看>>
大数据应用之Windows平台Hbase客户端Eclipse开发环境搭建
查看>>
项目呈现器 classFactory来创建
查看>>
oscache.properties文件配置
查看>>
【分享】企业管理中常见的五种虚假执行力
查看>>
linux下smb
查看>>
使用Google Chart API绘制组合图
查看>>
下拉刷新Listview(8.30)
查看>>
java service
查看>>