当前位置: 首页 > 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++ 中更高效且安全的替代手段。

http://www.xdnf.cn/news/365437.html

相关文章:

  • 利用混合磁共振成像 - 显微镜纤维束成像技术描绘结构连接组|文献速递-深度学习医疗AI最新文献
  • DAY04:Vue.js 指令与事件处理深度解析之从基础到实战
  • 弹窗表单的使用,基于element-ui二次封装
  • 十三、基于大模型的在线搜索平台——整合function calling流程
  • 萤石无插件取流巡检组件,便捷支持多屏预览与回放
  • MCP(Model Context Protocol,模型上下文协议)
  • tcpdump 的用法
  • [sklearn] 特征工程
  • LeRobot 项目部署运行逻辑(五)——intelrealsense.py/configs.py
  • 【PostgreSQL】不开启归档模式,是否会影响主从库备份?
  • OrangePi Zero 3学习笔记(Android篇)4 - eudev编译(获取libudev.so)
  • 边界网关协议 - BGP【高级】
  • 蓝绿激光对潜通信介绍
  • 【官方题解】StarryCoding 入门教育赛 2 | acm | 蓝桥杯 | 新手入门
  • 画家沈燕的山水实验:在传统皴法里植入时代密码
  • mysql性能提升方法大汇总
  • 【kafla扫盲】FROM GPT
  • 基于51单片机步进电机控制—9个等级
  • async/await 原理揭秘
  • Windows11下通过Docker安装Redis
  • USB学习【4】协议层数据格式
  • C++八股 —— 函数指针与指针函数
  • PPI-ID: 德克萨斯大学研究团队最新款蛋白-蛋白互作(PPI)预测工具上线
  • Ascend的aclgraph(一)aclgraph是什么?torchair又是怎么成图的?
  • 2025年 全新 AI 编程工具 Cursor 安装使用教程
  • 2025数维杯数学建模C题完整限量论文:清明时节雨纷纷,何处踏青不误春?
  • 空间复杂度** 与 **所需辅助空间**
  • 33、前台搜索功能怎么实现?
  • 基环树(模板) 2876. 有向图访问计数
  • Dp通用套路(闫式)