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

c++中深拷贝和浅拷贝的联系和区别

在 C++ 编程里,深拷贝和浅拷贝是两种不同的对象复制方式,它们在实现方式、资源管理和适用场景等方面存在显著差异。下面为你详细介绍它们的区别。

1. 基本概念

  • 浅拷贝:浅拷贝仅仅复制对象的成员变量值。对于基本数据类型(如 intdouble 等),会直接复制其值;而对于指针类型的成员变量,浅拷贝只是复制指针的值(即内存地址),这就导致多个对象会共享同一块内存空间。
  • 深拷贝:深拷贝不仅会复制对象的成员变量值,当遇到指针类型的成员变量时,它会为新对象的指针成员分配一块新的内存空间,并将原对象指针所指向的内存内容复制到新的内存空间中,这样每个对象都拥有自己独立的内存副本。

2. 实现方式

浅拷贝

浅拷贝通常由编译器自动生成的默认拷贝构造函数和赋值运算符重载函数来实现。以下是一个浅拷贝的示例代码:

#include <iostream>class ShallowCopyExample {
public:int* data;ShallowCopyExample(int value) {data = new int(value);}// 默认拷贝构造函数实现浅拷贝ShallowCopyExample(const ShallowCopyExample& other) {data = other.data;}~ShallowCopyExample() {delete data;}
};int main() {ShallowCopyExample obj1(10);ShallowCopyExample obj2(obj1); // 浅拷贝return 0;
}

在这个示例中,obj2 的 data 指针和 obj1 的 data 指针指向同一块内存空间。

深拷贝

深拷贝需要程序员手动编写拷贝构造函数和赋值运算符重载函数来实现。以下是一个深拷贝的示例代码:

#include <iostream>class DeepCopyExample {
public:int* data;DeepCopyExample(int value) {data = new int(value);}// 深拷贝构造函数DeepCopyExample(const DeepCopyExample& other) {data = new int(*other.data);}~DeepCopyExample() {delete data;}
};int main() {DeepCopyExample obj1(10);DeepCopyExample obj2(obj1); // 深拷贝return 0;
}

在这个示例中,obj2 的 data 指针指向一块新的内存空间,该空间存储的是 obj1 中 data 所指向的值的副本。

3. 资源管理

  • 浅拷贝:由于多个对象共享同一块内存空间,当其中一个对象释放了这块内存后,其他对象的指针就会变成悬空指针,再次使用这些指针会导致未定义行为。而且,如果多个对象都试图释放同一块内存,会引发内存重复释放的错误。
  • 深拷贝:每个对象都有自己独立的内存副本,对象的析构函数可以安全地释放自己的内存,不会影响其他对象,避免了悬空指针和内存重复释放的问题。

4. 性能开销

  • 浅拷贝:浅拷贝只复制指针的值,不涉及内存的分配和数据的复制,因此性能开销较小,速度较快。
  • 深拷贝:深拷贝需要为指针成员分配新的内存空间,并将数据复制到新的内存中,涉及内存的分配和数据的复制操作,性能开销相对较大,速度较慢。

5. 适用场景

  • 浅拷贝:当对象中不包含动态分配的资源(如动态数组、动态对象等),或者对象的生命周期管理比较简单,不需要独立的资源副本时,可以使用浅拷贝。
  • 深拷贝:当对象中包含动态分配的资源,并且需要每个对象都有自己独立的资源副本时,必须使用深拷贝,以确保资源的正确管理和避免内存问题。
http://www.lryc.cn/news/545080.html

相关文章:

  • Autotestplat 在多个平台和公司推荐使用!
  • 字符串最后一个单词的长度
  • 【Linux】learning notes(3)make、copy、move、remove
  • 一、图像图像的基本概念
  • 两道算法练习
  • 利用 Python 爬虫进行跨境电商数据采集
  • 设计模式--spring中用到的设计模式
  • Qt控件中函数指针使用的最终版本,使用std::function
  • Java中的泛型类 --为集合的学习做准备
  • 6.6.6 嵌入式SQL
  • 基于C#的CANoe CLR Adapter开发指南
  • 【Qt】MVC设计模式
  • 【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘
  • JAVA面试常见题_基础部分_Dubbo面试题(上)
  • CSS—隐藏元素:1分钟掌握与使用隐藏元素的方法
  • 二、双指针——5. 移动零
  • 论文笔记-NeurIPS2017-DropoutNet
  • php 对接mqtt 完整版本,订阅消息,发送消息
  • 谈谈 ES 6.8 到 7.10 的功能变迁(6)- 其他
  • 【苍穹外卖】问题笔记
  • 脑机接口SSVEP 信号特征提取技术术语
  • 【Veristand】Veristand 预编写教程目录
  • C#光速入门的指南
  • 深入探索 STM32 微控制器:从基础到实践
  • Oracle性能调优(一):时间模型统计
  • 前端Npm面试题及参考答案
  • 记一次线上Tomcat服务内存溢出的问题处理
  • nist关于rsa中p,q的要求
  • Vue3项目如何使用TailWind CSS保姆级教程
  • NO.22十六届蓝桥杯备战|一维数组|七道练习|冒泡排序(C++)