最简单的浅拷贝 vs 深拷贝示例(C++)

🎯 最简单的浅拷贝 vs 深拷贝示例


📦 浅拷贝(有问题)

cpp

#include <iostream>
using namespace std;

class Shallow {
public:
    int* data;
    
    Shallow(int val) {
        data = new int(val);  // 在堆上分配内存
    }
    
    // 使用编译器默认的拷贝构造函数(浅拷贝)
    ~Shallow() {
        delete data;  // 释放内存
    }
};

int main() {
    Shallow a(10);    // a.data 指向堆内存,值为10
    Shallow b = a;    // 浅拷贝!b.data 指向同一块内存
    
    *b.data = 20;     // 修改 b,a 也变了
    cout << *a.data;  // 输出 20
    
    // 析构时:a 和 b 都 delete 同一块内存 → 崩溃!
    return 0;
}

📦 深拷贝(正确的做法)

cpp

#include <iostream>
using namespace std;

class Deep {
public:
    int* data;
    
    Deep(int val) {
        data = new int(val);  // 在堆上分配内存
    }
    
    // 自定义拷贝构造函数(深拷贝)
    Deep(const Deep& other) {
        data = new int(*other.data);  // 重新分配内存,复制值
    }
    
    ~Deep() {
        delete data;  // 释放自己的内存
    }
};

int main() {
    Deep a(10);       // a.data 指向堆内存,值为10
    Deep b = a;       // 深拷贝!b.data 指向新的独立内存
    
    *b.data = 20;     // 修改 b,a 不受影响
    cout << *a.data;  // 输出 10
    
    // 析构时:各自释放自己的内存 → 安全!
    return 0;
}

📊 运行结果对比

代码浅拷贝深拷贝
内存布局两个指针指向同一块内存两个指针指向不同的内存块
修改 ba 也被修改a 保持不变
析构❌ 崩溃(double free)✅ 正常

🎯 核心区别(一行代码)

cpp

// 浅拷贝(默认)
b.data = a.data;              // 只复制地址

// 深拷贝(自定义)
b.data = new int(*a.data);    // 复制数据本身

💡 极简版对比

cpp

// ❌ 浅拷贝 - 危险!
int* a = new int(10);
int* b = a;        // 只复制指针
delete a;
delete b;          // 崩溃!

// ✅ 深拷贝 - 安全!
int* a = new int(10);
int* b = new int(*a);  // 复制值
delete a;
delete b;          // 安全!

一句话总结

  • 浅拷贝 = 复制钥匙(多个对象共用一把钥匙)

  • 深拷贝 = 复制房间(每个对象有自己的房间和钥匙)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值