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

值拷贝、浅拷贝和深拷贝

✅ 一、基本概念

1. 值拷贝(Value Copy)

  • 含义:将一个变量的值完整复制到另一个变量中。

  • 对象级别表现:调用的是拷贝构造函数(copy constructor)。

  • 特点:对基本类型或不含动态资源的对象,值拷贝通常等价于“成员逐个赋值”。

2. 浅拷贝(Shallow Copy)

  • 含义:复制对象的值,但不复制其内部资源(如指针指向的堆内存),只复制指针地址。

  • 风险:多个对象共享同一资源,可能导致悬挂指针、重复释放、资源篡改等问题

3. 深拷贝(Deep Copy)

  • 含义:复制对象的所有值,并为动态分配的资源重新分配空间并复制其内容,确保每个对象有自己的资源。

  • 特点:对象间完全独立,不会互相影响,内存安全。


✅ 二、值拷贝、浅拷贝、深拷贝的发生时机

拷贝类型发生时机
值拷贝拷贝基本类型变量(如 int, double 等)或 STL 容器中的 POD 类型元素
浅拷贝类没有自定义拷贝构造函数时,编译器自动生成的构造函数默认执行浅拷贝
深拷贝类中包含动态资源时,程序员需显式实现深拷贝构造函数与拷贝赋值运算符


✅ 三、对比如下

特性值拷贝浅拷贝深拷贝
复制内容值 + 指针地址值 + 指针指向内容
动态资源分配
安全性安全易出错:多重释放、悬挂指针等安全:每个对象资源独立
对象独立性独立共享资源完全独立
性能开销较大(但安全)
示例对象int a = b;MyClass(const MyClass&) 默认MyClass(const MyClass&) 自定义


✅ 四、实际代码示例

浅拷贝示例(默认拷贝)

class MyClass { public: int* data; MyClass(int val) { data = new int(val); } // 默认浅拷贝构造函数 ~MyClass() { delete data; } }; void test() { MyClass a(10); MyClass b = a; // 浅拷贝:data 指向同一块内存,b 和 a 冲突 }

深拷贝示例(手动构造)

class MyClass { public: int* data; MyClass(int val) { data = new int(val); } // 深拷贝构造函数 MyClass(const MyClass& other) { data = new int(*other.data); // 拷贝内容而非地址 } ~MyClass() { delete data; } };


✅ 五、应用场景总结

场景建议使用方式原因/说明
基本数据类型拷贝值拷贝即可开销小,语义清晰
拷贝 STL 容器元素默认拷贝或 moveSTL 容器元素通常支持深拷贝(比如 std::string
类中含动态分配资源深拷贝避免浅拷贝导致的内存错误
大对象不希望复制资源移动语义(C++11+)std::vector, 可使用 std::move() 提高效率
遍历对象不希望拷贝const auto& 遍历避免性能浪费,防止无意修改
只需只读访问且无资源冲突浅拷贝或引用都可看具体语义和类内部资源结构


✅ 总结一句话:

  • 值拷贝适用于基本类型;

  • 浅拷贝默认由编译器生成,容易出问题

  • 深拷贝需要自己实现,适用于资源敏感型对象

  • 引用和移动语义是现代 C++ 中更高效且安全的替代手段。

相关文章:

  • 一、每日Github软件分享----QuickGo外链直达工具​
  • LeetCode面试题 17.21 直方图的水量
  • ABP vNext + EF Core 实战性能调优指南
  • 浏览器自动化与网络爬虫实战:工具对比与选型指南
  • Liunx ContOS7 安装部署 Docker
  • Vue——Axios
  • ESP32开发入门(七):HTTP开发实践
  • Spring框架(1)
  • Idea Code Templates配置
  • CCDO|企业数字化转型:机制革新与人才培育的双重引擎
  • 【库(Library)、包(Package)和模块(Module)解析】
  • 关系模式-无损连接和保持函数依赖的判断
  • WPF 3D图形编程核心技术解析
  • 互联网大厂Java求职面试:基于AI的实时异常检测系统设计与实现
  • JAVA将一个同步方法改为异步执行
  • Altera系列FPGA纯verilog视频图像去雾,基于暗通道先验算法实现,提供4套Quartus工程源码和技术支持
  • 基 LabVIEW 的多轴电机控制系统
  • 如何训练deepseek语言大模型
  • Vue3 中 ref 与 reactive 的区别及底层原理详解
  • sqli-labs靶场18-22关(http头)
  • 巴基斯坦对印度发起网络攻击,致其约70%电网瘫痪
  • 古埃及展进入百天倒计时,闭幕前168小时不闭馆
  • 专访|高圆圆:像鸟儿一样,柔弱也自由
  • 胖东来发布和田玉、翡翠退货说明:不扣手续费等任何费用
  • 上海科创“八杰”赋能新兴产业链:硬核科技,形成良好盈利模式
  • 明查|这是“C919迫降在农田”?实为飞机模型将用于科普体验