🎯 最简单的浅拷贝 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;
}
📊 运行结果对比
| 代码 | 浅拷贝 | 深拷贝 |
|---|---|---|
| 内存布局 | 两个指针指向同一块内存 | 两个指针指向不同的内存块 |
| 修改 b | a 也被修改 | 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; // 安全!
一句话总结:
-
浅拷贝 = 复制钥匙(多个对象共用一把钥匙)
-
深拷贝 = 复制房间(每个对象有自己的房间和钥匙)
&spm=1001.2101.3001.5002&articleId=162342962&d=1&t=3&u=d30f413b996a4f34b4d40ed61d0d860c)
1419

被折叠的 条评论
为什么被折叠?



