🌊 浅拷贝 vs 🏗️ 深拷贝 —— 一文看懂!
🧍♂️ 举个生活例子:复印钥匙
想象你有一把家门钥匙🔑,你把它“拷贝”给朋友:
浅拷贝 = 你直接把原钥匙给了朋友 → 你们俩用的是同一把钥匙
👉 他丢了钥匙,你也进不了门!
👉 他配了一把新钥匙,你也多了一把!深拷贝 = 你去配了一把全新的、独立的钥匙给朋友 → 你们各有各的钥匙
👉 他丢了,不影响你
👉 他换锁了,你家门还是原样!
💡 在 C++ 中,这“钥匙”就是——指针指向的堆内存
当你有一个类,里面包含指针成员(比如 int* p;),拷贝对象时:
- 浅拷贝:只复制指针的值(地址)→ 两个对象指向同一块内存
 - 深拷贝:复制指针指向的内容 → 两个对象各自拥有独立的内存
 
📜 默认拷贝是“浅拷贝”
C++ 编译器默认提供的拷贝构造函数和赋值运算符,都是浅拷贝!
👇 看个浅拷贝出问题的例子:
1  | class Student {  | 
💥 这就是“浅拷贝陷阱”——重复释放内存,程序崩溃!
✅ 深拷贝:自己动手,丰衣足食!
我们手动写拷贝构造函数和赋值运算符,实现深拷贝:
1  | class Student {  | 
🧩 一句话总结
浅拷贝 = 复印地址(共享资源,危险!)
深拷贝 = 复印内容(独立资源,安全!)
🚨 什么时候需要深拷贝?
✅ 当你的类中包含:
- 指针成员(
int*,char*,MyClass*等) - 动态分配的资源(
new,malloc, 文件句柄等) - 任何“独占资源” —— 不能共享的东西!
 
📌 口诀:“三五法则”
如果你需要自定义析构函数、拷贝构造、赋值运算符中的任何一个,很可能三个都需要写!
🎁 额外小贴士:现代 C++ 更推荐用“智能指针”或“值语义”
比如:
1  | class Student {  | 
✅ 优先使用
std::string,std::vector,std::unique_ptr等 RAII 类型,避免手动管理内存!
🧠 考考你!
下面代码会出问题吗?
1  | class Cat {  | 
✅ 答案:深拷贝!
因为std::string内部已经帮你实现了深拷贝(或写时复制),你无需操心!
- 本文作者: 迪丽惹Bug
 - 本文链接: https://lyroom.github.io/2025/09/22/C-朝花夕拾-🌊-浅拷贝-vs-🏗️-深拷贝/
 - 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!