[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来确定当前对象是拷贝生成的还是构造生成的;在析构函数中对拷贝生成的对象不释放额外资源,原始生成的对象析构时才能释放额外资源,从而解决了同一个资源空间被释放多次的问题。

posted @ 2017-03-05 16:56  Strawberry丶  阅读(595)  评论(0编辑  收藏  举报