| 特性 | 浅拷贝 (Shallow Copy) | 深拷贝 (Deep Copy) |
| 操作对象 | 仅复制指针变量本身(64位系统通常 8 字节)。 | 复制指针指向的整块内存数据。 |
| 内存地址 | 两个指针指向同一个地址 (0x1234)。 | 两个指针指向不同的地址 (A指0x1234, B指0x5678)。 |
| 数据独立性 | 高度耦合。修改 A 的数据,B 也会变。 | 完全独立。修改 A 的数据,B 不受影响。 |
| 速度 | 极快(仅赋值一个整数)。 | 较慢(涉及 malloc/new 和内存搬运)。 |
| 主要风险 | 双重释放 (Double Free):如果 A 析构删了内存,B 就成了悬空指针,B 再析构就会崩。 | 内存消耗大:如果对象很大,频繁深拷贝会撑爆内存或拖慢 CPU。 |
A. 普通数据类型
对于普通数据类型(基础类型如int,double,bool,char以及不包含指针的简单struct/class),深拷贝和浅拷贝没有任何区别。
B. 标准容器 (std::vector,std::string)
std::vector<int> b = a;这是深拷贝。
b会在堆上申请新空间,把a的元素都拷过去。
std::vector<Node*> b = a;容器本身是新的(深拷贝),但容器里的元素是指针(浅拷贝)。
C. OpenCV 应用 (cv::Mat)
cv::Mat A = cv::imread("img.jpg"); cv::Mat B = A; // 【浅拷贝】B 和 A 共享同一块图像数据。修改 B 的像素,A 也会变。