当前位置: 首页 > news >正文

Effective C++ 条款 11:在 `operator=` 中处理“自我赋值”

文章目录

    • 条款 11:在 `operator=` 中处理“自我赋值”
      • 核心问题
      • 示例:使用地址比较
      • 示例:`copy-and-swap` 技术
      • 设计建议
      • 总结

条款 11:在 operator= 中处理“自我赋值”

核心问题

  • 自我赋值风险
    如果赋值操作符没有处理自我赋值(a = a),可能会导致未定义行为,如内存泄漏或数据损坏。

  • 检查方法
    operator= 中处理自我赋值的常见技术包括:

    1. 比较源对象和目标对象的地址。
    2. 使用 copy-and-swap 技术。

示例:使用地址比较

通过检查对象地址来处理自我赋值:

class Bitmap { ... };class Widget {
private:Bitmap* pb;  // 指针,指向一个从堆分配的对象public:Widget& operator=(const Widget& rhs) {if (this == &rhs) return *this;  // 检查自我赋值Bitmap* pOrig = pb;             // 记住原先的 pbpb = new Bitmap(*rhs.pb);       // 为 rhs.pb 分配新内存并复制delete pOrig;                   // 释放原先的内存return *this;}
};

关键点:

  1. 通过 if (this == &rhs) 检查自我赋值。
  2. 延迟删除原数据,确保新数据分配成功后再清理旧数据。

示例:copy-and-swap 技术

通过复制源对象并交换数据,可以简化逻辑并避免自我赋值问题:

class Widget {
private:Bitmap* pb;  // 指针,指向一个从堆分配的对象public:void swap(Widget& rhs) {  // 交换 *this 和 rhs 的数据std::swap(pb, rhs.pb);}Widget& operator=(const Widget& rhs) {Widget temp(rhs);  // 创建 rhs 的副本swap(temp);        // 交换副本和当前对象的数据return *this;}
};

关键点:

  1. copy-and-swap 自动处理自我赋值,因为副本创建在交换之前完成。
  2. 保证异常安全性:即使复制过程抛出异常,当前对象的状态仍然未被修改。

设计建议

  1. 自我赋值检查

    • 使用 if (this == &rhs) 明确检查。
    • 或采用 copy-and-swap 技术隐式避免自我赋值。
  2. 异常安全性

    • 在修改现有数据之前完成所有可能失败的操作(如动态分配内存)。
  3. 效率与灵活性

    • 对于简单类,直接地址比较可能更高效。
    • 对于复杂类,copy-and-swap 提供更高的代码复用性和易读性。

总结

  • 自我赋值是一种特殊情况,必须在 operator= 中妥善处理。
  • 可以通过地址比较和 copy-and-swap 技术来解决这一问题。
  • 采用合理的实现方式,确保代码的安全性、可维护性和异常处理能力。
http://www.lryc.cn/news/510172.html

相关文章:

  • 19、鸿蒙学习——配置HDC命令 环境变量
  • 初始 ShellJS:一个 Node.js 命令行工具集合
  • 网络工程师常用软件之PING测试工具
  • 深入探索仓颉编程语言:函数与结构类型的终极指南
  • Java 对象的内存分配机制详解
  • v8引擎垃圾回收
  • H5st5.0.0协议分析
  • 明达助力构建智能变电站新体系
  • Flink优化----FlinkSQL 调优
  • 机器学习(二)-简单线性回归
  • 01.01、判定字符是否唯一
  • 第五届“传智杯”全国大学生计算机大赛(练习赛)水题题解
  • iOS 苹果开发者账号: 查看和添加设备UUID 及设备数量
  • 推进数字园区建设-成都国际数字影像产业园
  • oracle linux8.10+ oracle 23ai安装
  • PH热榜 | 2024-12-25
  • OpenCV相机标定与3D重建(36)计算两幅图像之间基本矩阵(Fundamental Matrix)的函数findFundamentalMat()的使用
  • ZLG嵌入式笔记 | 电源设计避坑(上)
  • .NET能做什么?全面解析.NET的应用领域
  • 初始JavaEE篇 —— 网络原理---传输层协议:深入理解UDP/TCP
  • 企业如何搭建安全的跨网文件安全交换管理系统
  • 2023 年 12 月青少年软编等考 C 语言四级真题解析
  • GDPU Vue前端框架开发 期末赛道出勇士篇(更新ing)
  • 老旧小区用电安全保护装置#限流式防火保护器参数介绍#
  • 7.C语言 宏(Macro) 宏定义,宏函数
  • 4.系统学习-集成学习
  • Max AI prompt2:
  • [Unity Shader][图形渲染]【游戏开发】 Shader数学基础8 - 齐次坐标
  • 挑战一个月基本掌握C++(第十二天)了解命名空间,模板,预处理器
  • python实现根据搜索关键词爬取某宝商品信息