当前位置: 首页 > 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.dtcms.com/a/44142.html

相关文章:

  • VirtualBox启动报错WIN32_EXIT_CODE : 1077 (0x435)
  • AQS源码级别解析
  • 查找Excel包含关键字的行
  • 【星云 Orbit-F4 开发板】05. NVIC中断分组与配置(重要)
  • Svelte vs Vue:前端框架的深度对比与应用场景分析
  • 23种设计模式之《策略模式(Strategy)》在c#中的应用及理解
  • 2025:人形机器人量产潮与AI硬件终端创业风暴
  • Linux三种网络方式
  • 基于POI的Excel下拉框自动搜索,包括数据验证的单列删除
  • 【一起学Rust 框架篇 Tauri2.0框架】Tauri2.0环境搭建与项目创建
  • 商业秘密维权有哪些成本开支?
  • 《CAFE: Learning to Condense Dataset by Aligning Features》
  • 高效管理日志文件——深入解析日志轮转与Logrotate实践
  • 自动化测试开发
  • 【设计模式精讲】开源实战之剖析Spring框架:结合设计模式自定义SpringIOC
  • 基于fast-whisper模型的语音识别工具的设计与实现
  • 【MongoDB】在Windows11下安装与使用
  • 2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(二级)真题 + 答案
  • FFmpeg-chapter2-C++中的线程
  • 【AVRCP】深入理解蓝牙音频 / 视频远程控制规范:从基础到应用
  • weaviate 安装与测试
  • C# .NET Core HttpClient 和 HttpWebRequest 使用
  • windows服务器更新jar包脚本
  • 【pytest框架源码分析三】pluggy源码分析之hook注册调用流程
  • Compose笔记(七)--Modifier
  • 《算法笔记》9.6小节 数据结构专题(2)并查集 问题 C: How Many Tables
  • EasyExcel构建复杂多级表头
  • 网络安全员证书
  • go类(结构体)和对象
  • windows下玩转vllm:在wsl下安装vllm