[C/C++] 深拷贝和浅拷贝
·默认拷贝构造函数可以完成对象的数据成员值简单地复制-----浅拷贝
·对象的数据资源是由指针指示的堆时,默认拷贝构造函数仅作指针值的复制,需要显式定义拷贝构造函数-----深拷贝
首先定义几个点:
Point p1("home",1.0,2.0),p2("school",3.0),p3;
Point p1("home",1.0,2.0),p2("school",3.0),p3; Point p4 = p1;
浅拷贝:
深拷贝:
自定义的拷贝构造函数:
1 Point::Point(Point &p):x(p.x),y(p.y) 2 { 3 if(p.name) 4 { 5 name=new char[strlen(p.name)+1]; 6 strcpy(name,p.name); 7 } 8 else 9 { 10 name=new char[8]; 11 strcpy(name,"no name"); 12 } 13 cout<<name<<" copy constructing”; 14 }
注:若是浅拷贝,当p1先执行析构函数之后,name所指向的内存被释放掉;当p4再执行析构函数的时候,由于p1和p4中的name指向的是同一块地址空间,因此会因为对同一块地址释放两次内存而报错。但深拷贝就没有这个风险。
标记拷贝构造
对于深拷贝,需要把资源复制一份,而有时候资源很大,复制需要大量的时间和空间,甚至有些资源是不可复制的,这时深拷贝是不可取的,为此,可以选择带标记的拷贝构造。
原理:通过一个标志位flag来确定当前对象是拷贝生成的还是构造生成的;在析构函数中对拷贝生成的对象不释放额外资源,原始生成的对象析构时才能释放额外资源,从而解决了同一个资源空间被释放多次的问题。