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. 什么时候必须写深拷贝?
只要类中有指针指向堆内存,就必须:
- 自己实现拷贝构造函数
- 自己实现赋值运算符重载
否则默认浅拷贝一定会出问题。
最终背诵版
浅拷贝复制地址,共享内存,易造成重复释放;
深拷贝开辟新内存复制数据,各自独立,安全无冲突。
类中有指针成员时,必须手动实现深拷贝。

浙公网安备 33010602011771号