解释C++深拷贝和浅拷贝
我:
当类的属性中有指针变量时,内存空间是动态分配的,如果使用浅拷贝,只能将地址拷贝给新对象,需要使用深拷贝将地址指向的内容也拷贝给新对象。
书本解释:
浅拷贝:将原对象中每一个成员字段的值都拷贝到新对象中。这对于普通变量来说没有问题,但是对于指针型变量则未必成立。因为指针所指的那些内存都是动态分配的,并不会自动得到拷贝。这导致原对象与新对象中的字段,全部指向同一块动态分配的内存。由系统提供的拷贝构造,赋值运算符,执行的都是浅拷贝
深拷贝:不仅拷贝原对象中的每一个字段,而且将动态分配给该字段的内存内容一并拷贝过来。所以在面对有指针属性变量时,我们必须编写拷贝函数,并重载运算符
理解:原对象与新对象指针指向同一块动态内存的弊端:
①指针变量上存储的是另一个变量的地址,浅拷贝只是将这个地址拷贝给新对象,并没有给该地址上存储的变量开辟空间并拷贝,所以如果出现原对象已经将该地址释放了,如果新对象再次进行释放,造成重复释放同一块内存。
②两个指针指向同一块内存空间,任意一个指针对该内存进行操作,都会影响到另外一个指针。
深拷贝编写:
1 #include<iostream>
2 using namespace std;
3 class A{
4 public:
5 int a;
6 int *p;
7 A(int value1, int value2){
8 a = value;
9 p = new int(value2);
10 }
11 A(A& tmp){
12 a = tmp.a;
13 p = new int(* tmp.p);
14 }
15 ~A(){
16 delete p;
17 }
18
19 void show(){
20 cout<<a<<endl;
21 cout<<p<<endl;
22 cout<<*p<<endl;
23 }
24 };
25
26 int main(){
27 A test_a(10,20);
28 test_a.show();
29
30 A test_b(test_a);
31 test_b.show();
32
33 return 0;
34 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本