如何区分深拷贝和浅拷贝?在编程中它们的区别是什么?

摘要:特性浅拷贝 (Shallow Copy)深拷贝 (Deep Copy)操作对象仅复制指针变量本身(64位系统通常 8 字节)。复制指针指向的整块内存数据。内存地址两个指针指向同一个
特性浅拷贝 (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 也会变。
阅读全文