• c++深拷贝和浅拷贝的区别


    在 C++ 中,深拷贝(deep copy)和浅拷贝(shallow copy)是与对象拷贝相关的概念

    浅拷贝(Shallow Copy):

    • 浅拷贝是指将一个对象的值复制到另一个对象,但如果对象中包含指针成员,则只会复制指针的地址,而不会复制指针所指向的内容。这意味着两个对象将共享同一块内存空间。
    • 这意味着,如果原始对象和拷贝对象共享同一块内存,当其中一个对象修改了这块内存中的数据时,另一个对象中的数据也会被修改,因为它们指向同一块内存区域。这可能导致意外的数据修改或释放问题
    应用场景
    • 对象没有动态分配内存:如果一个类中的数据成员都是基本数据类型(如 int、float、char 等)或者其他不需要手动释放内存的类型,那么进行浅拷贝就足够了。因为这些数据成员的复制只涉及到值的复制,不会涉及资源管理的问题。
    • 资源共享的场景:有时候,我们希望多个对象共享某些资源,比如共享一个文件句柄、共享一个计数器等。在这种情况下,浅拷贝可以很好地满足需求,因为多个对象共享同一份资源,可以减少资源的重复占用。
    • 性能考虑:相比深拷贝,浅拷贝的成本更低。如果在某些情况下,对象的复制操作需要频繁进行且数据成员无需独立管理内存,那么选择浅拷贝可以提高效率。
    注意

    在使用浅拷贝时,要确保不会出现悬空指针、内存泄漏等问题。对于包含指针成员的类,如果这些指针指向的是动态分配的内存,可能会导致浅拷贝带来的问题。因此,在设计类时需要慎重考虑是否适合使用浅拷贝,以避免潜在的资源管理错误。

    深拷贝(Deep Copy):

    • 深拷贝是指在拷贝对象时,会创建一个新的对象,并将原始对象的所有内容都复制到新对象中,包括指针所指向的内容。
    • 这样就会完全复制原始对象的所有数据,即使原始对象和拷贝对象分别进行了修改,彼此之间也不会相互影响。
    应用场景
    • 类中包含指针成员:当一个类中包含指针成员时,进行浅拷贝将会导致多个对象共享同一块内存空间,容易出现数据修改或释放问题。在这种情况下,使用深拷贝可以复制指针所指向的内容,并确保原始对象和拷贝对象互不影响。
    • 动态分配内存:如果类中使用了动态分配的内存(例如通过 new 或 malloc 分配内存),并且希望在拷贝对象时也复制这些动态分配的内存,以避免内存释放问题,那么需要使用深拷贝。
    • 避免浅拷贝带来的问题:如果使用默认的拷贝构造函数或赋值运算符进行浅拷贝,可能会导致多个对象共享同一块内存空间,容易出现数据修改或释放问题。在这种情况下,使用深拷贝可以避免这些问题。
    注意

    在类中包含指针成员或动态分配的资源,希望确保拷贝对象与原始对象独立存在时,使用深拷贝是必要的。需要注意的是,在使用深拷贝时,除了拷贝构造函数,还需要正确实现析构函数、拷贝赋值运算符等相关函数,以便正确地管理动态分配的资源,避免内存泄漏和悬空指针等问题。

    DeepCopyExample类实现了深拷贝的方式,确保在拷贝对象时,动态分配的内存也得到复制。因此,即使原始对象和拷贝对象分别进行了修改,它们的数据之间也不会相互影响。
    相比之下,浅拷贝则只是简单地复制指针的地址,这可能导致多个对象共享同一块内存,容易出现意外的数据修改行为。因此,在设计类的时候,需要根据实际需求选择适合的拷贝方式,以避免潜在的问题。
    #include 
    
    class DeepCopyExample {
    private:
        int* data;
    
    public:
        DeepCopyExample(int value) {
            data = new int(value);
        }
    
        DeepCopyExample(const DeepCopyExample& other) {
            data = new int(*other.data);  // 进行深拷贝
        }
    
        void setData(int value) {
            *data = value;
        }
    
        int getData() const {
            return *data;
        }
    
        ~DeepCopyExample() {
            delete data;  // 释放动态分配的内存
        }
    };
    
    int main() {
        DeepCopyExample original(5);
        DeepCopyExample copy(original);  // 调用拷贝构造函数进行深拷贝
        std::cout << original.getData() << " " << copy.getData() << std::endl;  // 输出 "5 5"
        
        original.setData(10);
        std::cout << original.getData() << " " << copy.getData() << std::endl;  // 输出 "10 5"
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
  • 相关阅读:
    c++——构造函数, 析构函数,拷贝构造函数,赋值运算符重载,const成员
    基于 Kettle + StarRocks + FineReport 的大数据处理分析方案
    Activiti7审批流
    自5月以来,俄罗斯Sandworm黑客侵入了11家乌克兰电信公司
    【Qt】如何在麒麟操作系统上配置开发环境
    Spring概述
    将 springboot应用部署到 docker环境
    如何做好项目进度管理?关键在于细节
    不用编程实现USB或串口条码枪对接PLC,将数据写入到寄存器
    【C++ | 类型转换】转换构造函数、类型转换运算符 详解及例子源码
  • 原文地址:https://blog.csdn.net/weixin_43779276/article/details/136599293