35.浅拷贝和深拷贝的区别

35.浅拷贝和深拷贝的区别

一句话核心

浅拷贝只复制指针 / 地址,大家共用同一块内存;

深拷贝会重新开辟内存,复制数据内容,各自独立。

1. 浅拷贝(默认拷贝构造 / 赋值就是浅拷贝)

  • 只拷贝指针的值(地址)
  • 多个指针指向同一块内存
  • 析构时会重复释放同一块内存,导致崩溃
  • 不会自动拷贝指针指向的内容
int* p = new int[10];
int* q = p;   // 浅拷贝

问题:

  • 一个修改,全部受影响
  • 双重释放(double free)

2. 深拷贝(需要自己手动实现)

  • 开辟新的内存空间
  • 原数据内容复制到新空间
  • 两个对象完全独立,互不干扰
  • 不会重复释放
int* p = new int[10];
int* q = new int[10];
memcpy(q, p, 10*sizeof(int)); // 深拷贝

3. 什么时候必须写深拷贝?

只要类中有指针指向堆内存,就必须:

  • 自己实现拷贝构造函数
  • 自己实现赋值运算符重载

否则默认浅拷贝一定会出问题。

最终背诵版

浅拷贝复制地址,共享内存,易造成重复释放;

深拷贝开辟新内存复制数据,各自独立,安全无冲突。

类中有指针成员时,必须手动实现深拷贝。

posted @ 2023-07-03 21:25  CodeMagicianT  阅读(60)  评论(0)    收藏  举报