【C++】C++深拷贝与浅拷贝

在C++中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种不同的对象复制方式,主要涉及到动态内存分配的对象。它们之间的主要区别在于复制对象时是否复制了其所拥有的资源(如动态分配的内存)。

  1. 浅拷贝(Shallow Copy):

    • 浅拷贝只是复制了对象的引用或指针,而不是复制对象所指向的资源。

    • 当对象拥有动态分配的内存时,浅拷贝会导致多个对象共享同一块内存资源。

    • 如果原始对象被销毁,其所拥有的资源也会被释放,这可能会导致未定义行为,因为其他对象仍然引用着已经被释放的内存。

    示例代码:

    cpp 复制代码
    int* shallowCopy(int* original) {
        return original; // 只是复制了指针,没有复制指针指向的内存
    }
  2. 深拷贝(Deep Copy):

    • 深拷贝会创建原始对象所拥有的资源的一个全新副本。

    • 这意味着深拷贝会为新对象分配新的内存,并将原始对象的数据复制到新内存中。

    • 深拷贝确保每个对象都有自己的资源副本,因此原始对象的销毁不会影响到复制后的对象。

    示例代码:

    cpp 复制代码
    int* deepCopy(int* original, size_t size) {
        int* copy = new int[size];
        std::copy(original, original + size, copy);
        return copy; // 复制了指针指向的内存
    }

在C++中,深拷贝和浅拷贝的概念通常与对象的拷贝构造函数和赋值操作符重载相关。如果一个类管理了动态分配的资源,那么正确实现拷贝构造函数和赋值操作符以进行深拷贝是非常重要的,以避免潜在的内存管理问题。

例如,考虑以下简单的类,它使用动态分配的数组:

cpp 复制代码
class MyArray {
public:
    MyArray(size_t size) : size_(size), data_(new int[size]) {}
    ~MyArray() { delete[] data_; }
​
    // 禁用拷贝构造函数和赋值操作符以防止浅拷贝
    MyArray(const MyArray&) = delete;
    MyArray& operator=(const MyArray&) = delete;
​
    // 实现深拷贝的拷贝构造函数
    MyArray(const MyArray& other) : size_(other.size_), data_(new int[other.size_]) {
        std::copy(other.data_, other.data_ + size_, data_);
    }
​
    // 实现深拷贝的赋值操作符
    MyArray& operator=(MyArray other) {
        std::swap(size_, other.size_);
        std::swap(data_, other.data_);
        return *this;
    }
​
private:
    size_t size_;
    int* data_;
};

在这个例子中,我们通过自定义拷贝构造函数和赋值操作符来确保深拷贝的发生。同时,我们删除了默认的拷贝构造函数和赋值操作符,以防止编译器生成可能导致浅拷贝的版本。

相关推荐
码农编程录16 分钟前
【c/c++3】类和对象,vector容器,类继承和多态,systemd,std&boost
c++
guojl17 分钟前
Java多任务编排技术
java
丶意冷26 分钟前
mybatisPlus分页方言设置错误问题 mybatisPlus对于Oceanbase的Oracle租户分页识别错误
java·数据库·oracle·oceanbase
要开心吖ZSH1 小时前
《Spring 中上下文传递的那些事儿》Part 4:分布式链路追踪 —— Sleuth + Zipkin 实践
java·分布式·spring
桦说编程1 小时前
深入解析CompletableFuture源码实现
java·性能优化·源码
??tobenewyorker2 小时前
力扣打卡第二十一天 中后遍历+中前遍历 构造二叉树
数据结构·c++·算法·leetcode
蓝澈11212 小时前
迪杰斯特拉算法之解决单源最短路径问题
java·数据结构
Kali_072 小时前
使用 Mathematical_Expression 从零开始实现数学题目的作答小游戏【可复制代码】
java·人工智能·免费
rzl022 小时前
java web5(黑马)
java·开发语言·前端
时序数据说2 小时前
为什么时序数据库IoTDB选择Java作为开发语言
java·大数据·开发语言·数据库·物联网·时序数据库·iotdb